TIdHtttpでPUTを使用してファイルをアップロードしたいと思います。私はRemy LebeauからPUTを使わないという答えを見つけましたが、代わりにPOSTを使用しました。PUTを使用してTIdHTTPでファイルをアップロードする
私は3番目のAPIを使用しているため私の場合はできません.PUTを使用する必要があると指定しています。 POSTを使用しようとすると、メソッドが許可されていないというメッセージが返されます。
Response := TStringStream.Create;
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream');
FHttpComunication.Request.ContentType := 'multipart/form-data';
FHttpComunication.Put(UrlCmd, DS, Response);
をしかし、私はそれを行うとき、私は500 - Internal server error
を得る:
基本的に、私はこのような何かをしようとしています。
私は削除する場合:
FHttpComunication.Request.ContentType := 'multipart/form-data';
私は400 - Bad Request
を取得します。
私は既にブラウザ(Advanced REST client - chrome)からリクエストを直接実行しようとしましたが、それは動作します。 APIが動作しています。メッセージのヘッダそれが動作です:
PUT /api/2/project/XXXXXXXX/resource/export1po/translation/en/ HTTP/1.1 HOST: www.XXXXXXXXXXXXX.com authorization: Basic XXXXXXXXXXXXX content-type: multipart/form-data; boundary=----WebKitFormBoundaryPWT8bUdkQ1ZVLHdL accept: application/json accept-encoding: gzip, deflate accept-language: en-US,en;q=0.8 user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 content-length: 1936 ------WebKitFormBoundaryPWT8bUdkQ1ZVLHdL Content-Disposition: form-data; name="fileUpload2"; filename="teste.po" Content-Type: application/octet-stream
コードここではないですが、はい、私は認証情報を設定し、それが働いている私は他の人がAPIに呼び出して使用することができますので、私はこれを確認することができます。私が試したhttp://docs.transifex.com/api/translations/#put
方法:
1)この1本の返却500 - Internal Server Error
更新
これは私がPUT
を使用しようとしているAPIです。私はコンテンツタイプがapplication/octet-stream
のDSオブジェクトを作成しようとしました。しかし、私は同じエラーを持っています。
Response := TStringStream.Create;
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'multipart/form-data');
try
FHttpComunication.Request.ContentType := 'multipart/form-data';
FHttpComunication.Put(UrlCmd, DS, Response);
Result := Response.DataString;
finally
Response.Free;
DS.Free;
end;
2)答えに示唆された方法ですが、機能しません。私はエラー500
も持っています。
PutData := TFileStream.Create('C:\Users\r.rezino\Desktop\teste.po', fmOpenRead or fmShareDenyWrite);
Response := TStringStream.Create;
try
FHttpComunication.Request.ContentType := 'multipart/form-data'; //I tried with and without it
FHttpComunication.Put(UrlCmd, PutData, Response);
Result := Response.DataString;
finally
Response.Free;
PutData.Free;
end;
設定したすべてのヘッダーをフルコードで入力してください。 'AddFile'手続きの最後のパラメータは' application/octet-stream'でなければなりません。 'TIdMultiPartFormDataStream'を使わない場合、' ContentType'を手動で設定しないでください。さもなければ私が言及したように 'RequestContentType'関数を使用してください。 'TIdHTTP.Request.RawHeadersからヘッダーを保存します。Text'を使用するか、 'OnIdHTTPHeadersAvailable'イベントを使用してヘッダーを比較してください。あなたがまったく同じ要求を送るなら、それは働かなければなりません。 – smooty86