2017-05-18 3 views
0

このカールシーケンスはMS Windowsで動作し、Delphi XE 10.1 BerlinでIndyと同等の機能を使用しようとしています。Delphi XE10.1でカールを使用/解析する

カールコードはこれです:

curl -k "https://fakeweb.com/options" --data-binary "{\"name\":\"Name of the Client\",\"email\":\"[email protected]\"}" 

私は、次のコードを試してみましたが、それは常に私が同じmessagge取得

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 + '[email protected]\' + 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内部Sreverエラーを。 誰かが私を助けることができますか?

ありがとうございます。

+1

は、バックスラッシュなしでペイロードを送信します。カールのエスケープ文字のみです。 – mjn42

+0

@ mjn42回答ありがとうございますが、私もバックスラッシュなしで試してみました。同じエラーです。コードは最後のテストです。 – elcharlie

+0

あなたが求めているものとは無関係ですが、あなたは 'DataToSend'を解放していないようです。 – MartynA

答えて

3

はあなたのコードを持つ3つの問題があります。HTTPエラーが発生することがあり

  1. あなたのJSON文字列を破損しています、。スラッシュ文字は、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":"[email protected]"}'; 
    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; 
     finally 
    finally 
     DataToSend.Free; 
    end; 
    ShowMessage(Answer); 
    except 
    on E: Exception do 
     ShowMessage('Error: '+E.ToString); 
    end; 
end; 
関連する問題