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

谢谢。

您的代码存在三个问题:

  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;