【问题标题】:How to get form data from Postman To WebApi如何从 Postman To WebApi 获取表单数据
【发布时间】:2019-01-12 00:09:07
【问题描述】:

我想从 Postman 接收表单数据:

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 的数据,而且我限制只能使用 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--

卷发信息:

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 

【问题讨论】:

  • 这个 WebApi 方法在你的代码中放置在哪里?我在使用 MvcApplication 启动它时遇到问题...

标签: c# asp.net asp.net-web-api postman form-data


【解决方案1】:

1) 如果您必须发送Content-Type: multipart/form-data 或只需发送form-data

这是 Postman 的第一个 tab

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

[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 的第二个tab

那么你的 API 将是

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

那么当你用断点调试你的代码时,你会得到以下输出


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

这是 Postman 的第三个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());
}

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

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

你的输出将是

这个选项的好处是你可以发送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());
}

而你收集这些数据的模型是

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

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

你会看到输出是

【讨论】:

  • 谢谢,但那是我已经说过的I've restriction to use formdata only
  • 你有使用 async/await 的要求吗?
  • 不,无论如何我想得到form-data
  • 谢谢!但是您添加的是行 json 数据,而不是表单数据:)
  • @Faisal,试试这个 => HttpContext.Current.Request.Headers 并使用 linq 获取您的键值对
【解决方案2】:

从 Postman 发送并选择 form-data 选项时,以下代码将正确读取键/值

[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(部分:读取表单控件数据)。

编辑:发送到上述 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--

【讨论】:

  • 感谢您的回答!但在等待时出错:"ExceptionMessage": "Invalid 'HttpContent' instance provided. It does not have a content type header starting with 'multipart/'.\r\nParameter name: content", }`
  • @HinaKhuman 你能分享你从 Postman 尝试的 API 调用中的 curl 命令吗?
  • 不确定 curl 命令,我正在使用Content-Type: application/json
  • @HinaKhuman 我已经用Content-Type: application/json 尝试了上面的代码,它工作正常。 Postman 有一个Code option,您可以在其中导出 cURL、C# 等。您可以从那里发布代码,以便查看 API 调用的具体情况吗?
  • 好的,没问题,我明天早上会检查一下,我想我需要的是新鲜空气 :) 感谢 Tasos 的努力,非常感谢。
【解决方案3】:

下面的语句可以做到这一点:

NameValueCollection form = HttpContext.Current.Request.Form;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多