web-dev-qa-db-ja.com

Postman To Web Apiからフォームデータを取得する方法

Postmanからフォームデータを受け取りたい:

enter image description here

Content-Type: application/json

以下はWebApiメソッドです。

[HttpPost]
[Route("api/test")]
public async Task TestMethod(HttpRequestMessage request)
{
    var test = await request.Content.ReadAsStringAsync();
}

私が得ているものは:

------WebKitFormBoundarypqDvmeG89cBR9mK9
Content-Disposition: form-data; name="test"

esad
------WebKitFormBoundarypqDvmeG89cBR9mK9--

しかし、WebKitFormBoundaryを使用したデータは必要ありません。フォームデータのみを使用するように制限しています。他に方法はありますか?

HTTP呼び出し情報:

POST /api/test HTTP/1.1
Host: localhost:16854
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 1a3d6427-4956-707d-da0c-3a29a63c7563

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="test"

esad
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Curl呼び出し情報:

curl -X POST \
  http://localhost:16854/api/test \
  -H 'cache-control: no-cache' \
  -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -H 'postman-token: 02055873-e9a8-e9a6-019c-b407992b0e2f' \
  -F test=esad 
4
Hina Khuman

1)送信する必要がある場合Content-Type: multipart/form-data OR単にform-data

これはPostmanの最初のtabです

enter image description here

投稿したform-dataのキーと値のペアを1つだけ収集する必要がある場合

[HttpPost]
[Route("api/test")]
public HttpResponseMessage TestMethod(HttpRequestMessage request)
{
    var testValue = HttpContext.Current.Request.Form["test"];

    return Request.CreateResponse(HttpStatusCode.OK, testValue);
}

投稿したform-dataのキーと値のペアを複数収集する必要がある場合

[HttpPost]
[Route("api/test")]
public HttpResponseMessage TestMethod(HttpRequestMessage request)
{
    NameValueCollection collection = HttpContext.Current.Request.Form;

    var items = collection.AllKeys.SelectMany(collection.GetValues, (k, v) => new { key = k, value = v });

    //We just collect your multiple form data key/value pair in this dictinary
    //The following code will be replaced by yours
    Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();

    foreach (var item in items)
    {
        keyValuePairs.Add(item.key, item.value);
    }

    return Request.CreateResponse(HttpStatusCode.OK, keyValuePairs);
}

2)Content-Type: application/x-www-form-urlencodedを送信する必要がある場合

これはPostmanの2番目のtabです

enter image description here

その後、あなたのAPIは

[HttpPost]
[Route("api/test")]
public async Task TestMethod(HttpRequestMessage request)
{
    var test = await request.Content.ReadAsFormDataAsync();
}

次に、ブレークポイントを使用してコードをデバッグすると、次の出力が得られます

enter image description here


3)Content-Type: application/jsonを送信する必要がある場合

これはPostmanの3番目のtabです

そのようなオプションについては、以下のスクリーンショットを参照してください

enter image description here

そしてあなたのAPIは

[HttpPost]
[Route("api/test")]
public async Task TestMethod(HttpRequestMessage request)
{
     var jObject = await request.Content.ReadAsAsync<JObject>();

     Item item = JsonConvert.DeserializeObject<Item>(jObject.ToString());
}

そして、この投稿されたデータを収集するためのモデル

public class Item
{
    public string test { get; set; }
}

そしてあなたの出力は

enter image description here

このオプションの利点は、投稿されたデータとしてcomplex typeを送信できることなどです。

enter image description here

そしてあなたのAPIは

[HttpPost]
[Route("test")]
public async Task TestMethod(HttpRequestMessage request)
{
    var jObject = await request.Content.ReadAsAsync<JObject>();

    Sample sample = JsonConvert.DeserializeObject<Sample>(jObject.ToString());
}

このデータを収集するためのモデルは

public class Item
{
    public string test { get; set; }
}

public class Sample
{
    public Item item { get; set; }
}

そして、あなたは出力が

enter image description here

14
er-sho

次のコードは、form-dataオプションを選択してPostmanから送信されると、キー/値を正しく読み取ります

[HttpPost]
[Route("api/test")]
public async Task<HttpResponseMessage> TestMethod(HttpRequestMessage request)
{
    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    await Request.Content.ReadAsMultipartAsync(provider);

    var testValue = provider.FormData.GetValues("test")[0];

    return Request.CreateResponse(HttpStatusCode.OK);
}

より完全な例が見つかります here (セクション:Reading Form Control Data)。

編集:上記のAPIハンドラーに送信されるHTTP呼び出しは次のとおりです。

POST /api/stats/testmethod HTTP/1.1
Host: localhost:4100
Cache-Control: no-cache
Postman-Token: 999fd13d-f804-4a63-b4df-989b660bcbc5
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="test"

esad
------WebKitFormBoundary7MA4YWxkTrZu0gW--
1
Tasos K.

以下のステートメントはこれを行うことができます:

NameValueCollection form = HttpContext.Current.Request.Form;
0
Piyush