Using/Parsing 在 Delphi XE10.1 中卷曲
Using/Parsing curl in Delphi XE10.1
我有这个 curl 序列,它在 MS Windows 中有效,我正在尝试在 Delphi XE 10.1 Berlin 中使用 Indy 的等效项。
curl代码是这样的:
curl -k "https://fakeweb.com/options" --data-binary "{\"name\":\"Name of the Client\",\"email\":\"fake@gmail.com\"}"
我已经尝试了下面的代码,但是它不起作用
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;
我总是收到相同的消息: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;
我有这个 curl 序列,它在 MS Windows 中有效,我正在尝试在 Delphi XE 10.1 Berlin 中使用 Indy 的等效项。
curl代码是这样的:
curl -k "https://fakeweb.com/options" --data-binary "{\"name\":\"Name of the Client\",\"email\":\"fake@gmail.com\"}"
我已经尝试了下面的代码,但是它不起作用
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;
我总是收到相同的消息: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;