测试 API Post 传递 <Frombody()> 类 - 始终为 NULL

Posted

技术标签:

【中文标题】测试 API Post 传递 <Frombody()> 类 - 始终为 NULL【英文标题】:Testing API Post passing a <Frombody()> class - Always NULL 【发布时间】:2017-08-04 04:58:57 【问题描述】:

我正在 VB 中创建一个 api 控制器类。我有一个非常简单的功能:

Public Function Post(<FromBody()> ByVal value As String) As String
    Return value
End Function

当我从 HTTP 工具(FireFox 扩展)发送 POST 请求时,我可以看到它进入函数,但 value 始终为空。

我的WebApiConfig.vb中有这个:

config.Routes.MapHttpRoute(
        name:="Names",
        routeTemplate:="controller/id",
        defaults:=New With .id = RouteParameter.Optional

这个在Global.ASAX.vbApplication-Start():

RouteTable.Routes.MapHttpRoute(name:="Post", routeTemplate:="post", defaults:=New With .symbol = RouteParameter.Optional, .controller = "Names")

我也在 Fiddler 4 中尝试过,但我得到了:

"Message":"请求包含实体主体但没有Content-Type 标题。推断的媒体类型“application/octet-stream”不是 支持此资源。","ExceptionMessage":"否 MediaTypeFormatter 可用于读取“字符串”类型的对象 来自具有媒体类型的内容 '应用程序/八位字节流'。","ExceptionType":"System.Net.Http.UnsupportedMediaTypeException","StackTrace":" 在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable '1 格式化程序,IFormatterLogger formatterLogger, CancellationToken cancelToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage 请求,类型类型,IEnumerable '1 格式化程序,IFormatterLogger formatterLogger, CancellationToken cancelToken)"

或者当我尝试在标题中设置内容类型时,我得到:

没有 MediaTypeFormatter 可用于读取“字符串”类型的对象 来自具有媒体类型的内容...

<...> 是我设置的任何媒体类型。

如何使这个简单的 POST 工作?

【问题讨论】:

【参考方案1】:

看起来您用于 API 的框架不知道如何根据您在请求中设置的内容类型标头解析 POST 请求的正文内容。

还有,你的API controller may not know how to parse plain text。

您可以手动添加支持的内容类型,也可以根据上述链接中的答案之一手动读取请求内容。或者您可以将您的控制器更改为accept a form post like so。

【讨论】:

这可能是一个相当不错的问题答案。但是,我走了一条不同的路线,并不能真正证明用所提供的答案重新测试它的时间是合理的。希望其他人觉得这很有用。

以上是关于测试 API Post 传递 <Frombody()> 类 - 始终为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

POST 参数未使用 VBA 传递给 Web API

如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?

如何在飞镖的 API POST 调用中传递授权标头?

JUnit测试POST到参数化的API

在 POST API 中传递多个参数,而不使用 .Net Core MVC 中的 DTO 类

Web Api如何传递POST请求