elc*_*lie 2 delphi rest curl indy10 delphi-10.1-berlin
我有这个 curl 序列,它在 MS Windows 中工作,我试图在 Delphi XE 10.1 Berlin 中使用与 Indy 的等效项。
卷曲代码是这样的:
curl -k "https://fakeweb.com/options" --data-binary "{\"name\":\"Name of the Client\",\"email\":\"fake@gmail.com\"}"
Run Code Online (Sandbox Code Playgroud)
我已经尝试了以下代码,但它不起作用
procedure TForm2.Button4Click(Sender: TObject);
const
COMI = Char(34);
var
data: string;
DataToSend : TStringStream;
IdHTTP: TIdHTTP;
Answer: string;
begin
try
data := '{\' + COMI + 'name\' + COMI + ':\' + COMI + 'Name of the Client\' + COMI +
',\' + COMI + 'email\' + COMI + ':\' + COMI + 'fake@gmail.com\' + COMI + '}' ;
DataToSend := TStringStream.Create(data);
IdHTTP := TIdHTTP.Create(Application);
IdHTTP.Request.Accept := 'application/json, text/plain; q=0.9, text/html;q=0.8,';
IdHTTP.Request.ContentType := 'application/json, text/plain; q=0.9, text/html;q=0.8,';
Answer := IdHTTP.Post('https://fakeweb.com/options', DataToSend); //its not the real URL
ShowMessage(Answer);
except on E: Exception do
ShowMessage('Error: '+E.ToString);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我总是收到相同的消息:HTTP/1.1 500 内部服务器错误。有人可以帮助我吗?
谢谢你。
您的代码存在三个问题:
您正在破坏 JSON 字符串,这可能会导致 HTTP 错误。斜线字符不用作 Delphi 字符串文字中的转义序列(它甚至不是 curl 本身的转义序列。它是需要它的命令行处理器),因此您发布的实际斜线字符不完全属于您的 JSON 数据。此外,虽然技术上没有错误,但您的COMI常量是不必要的,因为 Delphi 字符串'用于引用,因此您可以安全地"在字符串数据中按原样使用。
您正在将该TIdHTTP.Request.ContentType属性设置为无效值,这也可能导致 HTTP 错误。
如果此代码在 Windows 或 OSX 上运行,则您正在泄漏正在创建的对象(好吧,该TIdHTTP对象并未完全“泄漏”,但在应用程序退出之前不会被销毁)。如果代码在 iOS 或 Android 上运行,则不会泄漏。
试试这个:
procedure TForm2.Button4Click(Sender: TObject);
var
data: string;
DataToSend : TStringStream;
IdHTTP: TIdHTTP;
Answer: string;
begin
try
data := '{"name":"Name of the Client","email":"fake@gmail.com"}';
DataToSend := TStringStream.Create(data, TEncoding.UTF8);
try
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.Request.Accept := 'application/json, text/plain;q=0.9, text/html;q=0.8';
IdHTTP.Request.ContentType := 'application/json';
Answer := IdHTTP.Post('https://fakeweb.com/options', DataToSend);
finally
IdHTTP.Free;
end;
finally
DataToSend.Free;
end;
ShowMessage(Answer);
except
on E: Exception do
ShowMessage('Error: '+E.ToString);
end;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3261 次 |
| 最近记录: |