如何从Postman到WebApi获取表单数据

Hin*_*man 4 c# asp.net form-data asp.net-web-api postman

我想收到邮递员的表格数据:

在此输入图像描述

Content-Type: application/json

这是WebApi方法:

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

我得到的是:

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

esad
------WebKitFormBoundarypqDvmeG89cBR9mK9--
Run Code Online (Sandbox Code Playgroud)

但我不想要数据,WebKitFormBoundary我只限制使用formdata.还有其他方法吗?

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--
Run Code Online (Sandbox Code Playgroud)

卷曲呼叫信息:

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 
Run Code Online (Sandbox Code Playgroud)

er-*_*sho 11

1)如果你必须Content-Type: multipart/form-data简单地发送ORform-data

这是tabPostman 的第一个

在此输入图像描述

如果您只需要收集已发布的一个键/值对 form-data

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

    return Request.CreateResponse(HttpStatusCode.OK, testValue);
}
Run Code Online (Sandbox Code Playgroud)

如果您必须收集已发布的多个键/值对 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);
}
Run Code Online (Sandbox Code Playgroud)

2)如果你必须发送 Content-Type: application/x-www-form-urlencoded

这是tabPostman 的第二个

在此输入图像描述

然后你的API将是

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

然后,当您使用断点调试代码时,您将获得以下输出

在此输入图像描述


3)如果你必须发送 Content-Type: application/json

这是tab邮差的第三个

有关此选项,请参见下面的屏幕

在此输入图像描述

你的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());
}
Run Code Online (Sandbox Code Playgroud)

而你的模型收集这个发布的数据

public class Item
{
    public string test { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你的输出将是

在此输入图像描述

这个选项的优点是你可以发送complex type作为发布数据等

在此输入图像描述

你的api是

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

    Sample sample = JsonConvert.DeserializeObject<Sample>(jObject.ToString());
}
Run Code Online (Sandbox Code Playgroud)

而你建模收集这些数据

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

public class Sample
{
    public Item item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你会看到输出是

在此输入图像描述