在POST中将JSON发送到Web API服务时出错


90

我正在使用Web API创建Web服务。我实施了一个简单的课程

public class ActivityResult
{
    public String code;
    public int indexValue;
    public int primaryCodeReference;
}

然后我在控制器内部实现了

[HttpPost]
public HttpResponseMessage Post(ActivityResult ar)
{
    return new HttpResponseMessage(HttpStatusCode.OK);
}

但是,当我调用POST中传递的API时,文件为json:

{"code":"XXX-542","indexValue":"3","primaryCodeReference":"7"}

我收到以下错误消息:

{
    "Message": "The request entity's media type 'text/plain' is not supported for this resource.",
    "ExceptionMessage": "No MediaTypeFormatter is available to read an object of type 'ActivityResult' from content with media type 'text/plain'.",
    "ExceptionType": "System.Net.Http.UnsupportedMediaTypeException",
    "StackTrace": "   in System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   in System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   in System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"
}

我究竟做错了什么?


9
您必须添加标题“ application / json”,才能从客户端接受有效负载。
亚当·祖克曼2014年

我已经在HTTP请求中正确设置了标头。但是,问题似乎出在服务器端:dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82 2014年

4
看来您只是将Accept标头设置为application/json。您还需要将Content-Type标题设置为application/json
Brian Rogers

Answers:


186

在HTTP请求中,您需要将Content-Type设置为: Content-Type: application/json

因此,如果您使用的是提琴手客户端,请添加Content-Type: application/json到请求标头中


2
  1. 您必须添加标题属性 Content-Type:application/json
  2. 定义任何POST请求方法输入参数时,应将其注释为[FromBody]例如

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
    
  3. 任何JSON输入数据都必须是原始数据。


1

另一个提示...在“编写器/已分析”选项卡上的文本框字段中添加“内容类型:应用程序/ json”的地方。这里已经填充了3行,因此我将此Content-type添加为第四行。这使邮政工作。


0

请检查您是否正在传递方法,POST而不是GET。如果是这样,您将得到与上面发布的相同的错误。

$http({               
 method: 'GET',

此资源不支持请求实体的媒体类型“文本/纯文本”。


1
问题特别是关于http POST的,他没有从服务器请求数据,而是向服务器发送数据。
战争

0

我的所有设置都包含在接受的答案中。我遇到的问题是我正在尝试更新Entity Framework实体类型“ Task”,例如:

public IHttpActionResult Post(Task task)

对我有用的是创建自己的实体“ DTOTask”,例如:

public IHttpActionResult Post(DTOTask task)

0

它要求Content-Type:application/json在不提及任何内容的情况下包含在Web api请求标头部分中,然后默认情况下Content-Type:text/plain传递给请求。

在邮递员工具上测试api的最佳方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.