【问题标题】:How to set body data indy HTTPS post如何设置正文数据 indy HTTPS post
【发布时间】:2017-02-16 09:52:12
【问题描述】:

所以我环顾四周,描述我的问题的唯一问题是 6 岁,有 0 个答案,所以我想我会再试一次。

我正在使用带有 Indy10 的 delphi 2009。

我正在尝试使用 HTTPS 将 JSON 发布到 api。

Instance.FHTTP := TIdHTTP.Create;
Instance.FHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Instance.FHTTP);

{$IFDEF DEBUG}
Instance.FHTTP.ProxyParams.ProxyPort := 8888;
Instance.FHTTP.ProxyParams.ProxyServer := '127.0.0.1';
{$ENDIF}

Instance.FHTTP.Request.ContentType := 'application/json';
Instance.FAccessToken := Instance.FHTTP.Post('https://somedomain.com/api/endpoint', '{JSONName: JSONValue }' );

我看到很多答案表明JSON 有效负载应该作为string 参数在TidHTTP.Post 方法中给出,但是当我尝试这样做时,它需要一个文件路径,并抛出一条错误消息:

'无法打开文件“[path to project{JSONName:JSONValue }]”。找不到指定的文件'。

如果我将我的 JSON 添加到 TStringList 并将其添加为参数,它只会将 JSON 添加到请求的标头中。

非常感谢任何帮助。

【问题讨论】:

  • "我看到很多答案表明 JSON 有效负载应该作为字符串参数给出" - 这样的例子是错误的,我很惊讶有人会这样做首先给定参数名称的错误是ASourceFile。 “如果我将我的 JSON 添加到 TStringList 并将其添加为参数,它只会将 JSON 添加到请求的标头中。” 不,它没有。它使用application/x-www-form-urlencoded 格式格式化POST 正文中的TStringList 数据。

标签: delphi https http-post indy


【解决方案1】:

采用第二个字符串的Post 重载确实将其解释为文件名:

function Post(AURL: string; const ASourceFile: String): string; overload;

这就是为什么这不起作用。您需要改用采用TStream 的重载:

function Post(AURL: string; ASource: TStream): string; overload;

您可以将您的 JSON 放入 TStringStream:

StringStream := TStringStream.Create('{JSONName: JSONValue }', TEncoding.UTF8);
try
  Instance.FAccessToken := Instance.FHTTP.Post('https://somedomain.com/api/endpoint', StringStream);
finally
  StringStream.Free;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2021-08-27
    • 2011-10-08
    • 2018-11-18
    • 2021-01-05
    • 2015-12-21
    • 2023-03-25
    相关资源
    最近更新 更多