在 Delphi XE10.1 中使用/解析 curl

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 内部服务器错误。有人可以帮助我吗?

谢谢你。

Rem*_*eau 5

您的代码存在三个问题:

  1. 您正在破坏 JSON 字符串,这可能会导致 HTTP 错误。斜线字符不用作 Delphi 字符串文字中的转义序列(它甚至不是 curl 本身的转义序列。它是需要它的命令行处理器),因此您发布的实际斜线字符不完全属于您的 JSON 数据。此外,虽然技术上没有错误,但您的COMI常量是不必要的,因为 Delphi 字符串'用于引用,因此您可以安全地"在字符串数据中按原样使用。

  2. 您正在将该TIdHTTP.Request.ContentType属性设置为无效值,这也可能导致 HTTP 错误。

  3. 如果此代码在 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)