web-dev-qa-db-ja.com

HTTPの送信POST RestSharpを使用したマルチパート/フォームデータフィールド

REST作業中のプロジェクトに使用する必要があるAPIに対してRestSharpを使用する際に問題が発生しました。発行する必要がある要求は、ヘッダーAPIキー、アップロードするファイル、およびJSON形式の大量のデータAPIでは、データ部分は「data」というフォームフィールド名を使用して送信する必要があります。何らかの理由で、これは本文内のフィールド「data」リクエストの。

私が持っているコードは次のとおりです:

_var request = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST)
{
    RequestFormat = DataFormat.Json,
    AlwaysMultipartFormData = true,
    JsonSerializer = new RestSharpJsonDotNetSerializer(customSerializer)
};

if (doc is DocA)
    request.AddParameter("data",doc as DocA,ParameterType.RequestBody);
    //request.AddBody(doc as DocA);
else
    request.AddParameter("data", doc as DocB,ParameterType.RequestBody);
    //request.AddBody(doc as DocB);

request.AddFile("file", doc.File.FullName);
_

ご覧のとおり、request.AddBody(doc)メソッドとrequest.AddParameter(name, object, type)メソッドの両方を使用しようとしました。サーバーから必要なパラメーターが欠落しているという応答を受け取ったため、どちらもデータを適切に送信していないようです。フィドラーを使用すると、バイナリデータは表示されますが、これらのメソッドの両方でJSONデータは表示されません。私はRestSharpのドキュメントを調べましたが、フォームデータ本体の特定の「フィールド」名を「データ」として指定できるものを見つけることができません。これが私が抱えている問題の原因であると考えています。ここで何が間違っていますか?

編集:フィドラーでさらに検査すると、HTTPリクエストのボディにJSONデータがまったく追加されていないようです。ただし、アップロード(コマンドの実行)の直前にブレークポイントがあると、パラメーターリスト(およびファイルリスト)内ですべてが適切にシリアル化されていることがわかります。 Fiddlerで検査すると、ファイルのバイナリデータ、マルチパート/フォームデータの境界、そして何も表示されません。私はこれが私のデータがあるはずの場所だと思います...

18
JNYRanger

そこで、AddBodyメソッドを使用して、マルチパートフォームイメージを自動的に強制終了し、それらを送信しないという問題を回避することでこれを行っています。 代わりにaddパラメーターを使用する必要があります。

この問題を解決するには、通信の両側で少し作業する必要があります。

クライアントからメッセージを送信するには、次の手順を実行します。

new RestRequest("<Your URI>");
request.AddParameter("request", tokenRequest.ToJson());
request.AddFile("front", frontImage.CopyTo, "front");
request.AddFile("back", backImage.CopyTo, "back");
request.AddHeader("Content-Type", "multipart/form-data");

私のWebサービス側では、メソッドへの引数としてjsonを受け入れ、ファイルストリームへの参照を手動で取得します。

public JsonResult MyService(StoreImageRequest request)
{
    var frontImage = HttpContext.Request.Files["front"].InputStream;
    var backImage = HttpContext.Request.Files["front"].InputStream;
}
11
C Tierney

サーバーがJSON本体とファイル部分を持つマルチパートを処理できる場合、次のようになります。

        var req = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST);

        req.RequestFormat = DataFormat.Json;
        req.AddBody(doc);

        req.AddFileBytes("TestImage", Properties.Resources.TestImage, "TestImage.jpg");

        req.AddHeader("apikey", "MY-API-KEY");
        var resp = restClient.Execute<ApiResult>(req);

サーバー側では、このようなマルチパートリクエストは次のように処理する必要があります。

    [HttpPost]
    public JsonResult UploadDoc()
    {
        // This is multipart request. So we should get JSON from http form part:
        MyDocModel doc = JsonConvert.DeserializeObject<MyDocModel>(Request.Form[0]);

        foreach (string fileName in request.Files)
        {
            HttpPostedFileBase file = request.Files[fileName];
        }
0
epox