2017-02-16 49 views
0

所以我環顧四周,唯一的問題描述我的問題是6歲,0答案,所以我想我會再試一次。如何設置正文數據indy HTTPS發佈

我使用delphi 2009與Indy10。

我想使用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有效載荷應給予作爲TidHTTP.Post方法string PARAM,但是當我嘗試,它需要一個文件路徑,並拋出一個錯誤說:

'無法打開文件'[項目{JSONName:JSONValue}的路徑]]「。指定的文件未找到'。

如果我加我JSONTStringList,並添加給予,作爲一個參數,它只是增加了JSON請求的報頭。

任何幫助,非常感謝。

+0

「*我見過很多答案提示JSON有效載荷應給予作爲一個字符串參數*「 - 這樣的例子是錯誤的,我很驚訝任何人會首先犯這個錯誤,因爲參數名是'ASourceFile'。 「*如果我將我的JSON添加到TStringList並添加它作爲參數,它只是將JSON添加到請求的頭部。*」不,它不。它使用'application/x-www-form-urlencoded'格式來格式化POST主體中的'TStringList'數據。 –

回答

4

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;