测试 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.vb
下Application-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 请求以测试 RESTful API?