1

TIdHtttp で PUT を使用してファイルをアップロードしたいと考えています。Remy Lebeau から、PUT を使用せずに POST を使用するようにという回答が見つかりました。

しかし、私の場合は、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

私はすでにブラウザー (高度な REST クライアント - クロム) から直接要求を実行しようとしましたが、動作します。したがって、APIは機能しています。動作時のメッセージのヘッダーは次のとおりです。

PUT /api/2/project/XXXXXXXX/resource/export1po/translation/en/ HTTP/1.1
ホスト: www.XXXXXXXXXXXXX.com
承認: 基本 XXXXXXXXXXXXX
コンテンツ タイプ: マルチパート/フォーム データ。境界=----WebKitFormBoundaryPWT8bUdkQ1ZVLHdL
受け入れる: アプリケーション/json
受け入れエンコーディング: gzip、デフレート
受け入れる言語: en-US,en;q=0.8
ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Gecko のような KHTML) Chrome/51.0.2704.103 Safari/537.36
コンテンツの長さ: 1936   

------WebKitFormBoundaryPWT8bUdkQ1ZVLHdL
Content-Disposition: フォームデータ。name="fileUpload2"; ファイル名="teste.po"
コンテンツ タイプ: アプリケーション/オクテット ストリーム

コードはここにありませんが、はい、承認情報を構成しました。機能しています。他の API 呼び出しを使用できるため、これを確認できます。

アップデート

これは私が使用しようとしている API ですPUT: http://docs.transifex.com/api/translations/#put

私が試した方法:

1) この 1 つのリターン500 - Internal Server Error. コンテンツタイプのDSオブジェクトも作成してみましたapplication/octet-stream。しかし、同じエラーが発生しました。

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;
4

2 に答える 2

6

その API は設計上壊れています。multipart/form-dataと を混ぜてはいけませんPUT。こんな風に送ればいいのに

FPutData:=TFileStream.Create('yourfile.dat', fmOpenRead or fmShareDenyWrite);
FHTTP.Put('http://...', FPutData, FResponseStream);

しかし、それが機能しない場合、問題はおそらく正しいContentTypeを設定していないことであり、境界が含まれていません。このように修正します

FHTTP.Request.ContentType:=DS.RequestContentType;

DSあなたの はどこですかTIdMultiPartFormDataStream

于 2016-07-27T12:42:19.227 に答える
1

問題が見つかりました。それは私が設定しなければならない境界についてでした。したがって、最終結果は次のとおりです。

DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream');
try
    FHttpComunication.Request.ContentType := 'multipart/form-data; boundary=' + DS.Boundary;
    FHttpComunication.Request.AcceptEncoding := '';
    FHttpComunication.Request.Accept := '';
    FHttpComunication.Request.Host := '';
    FHttpComunication.Request.UserAgent := '';

    FHttpComunication.Put(UrlCmd, DS, Response);
finally
    DS.Free;
    Response.Free;
end;
于 2016-07-28T11:46:07.960 に答える