Lỗi khi gửi json trong POST tới dịch vụ API web


90

Tôi đang tạo một dịch vụ web bằng API Web. Tôi đã triển khai một lớp đơn giản

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

Và sau đó tôi đã triển khai bên trong bộ điều khiển của mình

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

Nhưng khi tôi gọi API chuyển vào POST tệp json:

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

Tôi nhận được thông báo lỗi sau:

{
    "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)"
}

Tôi đang làm gì sai?


9
Bạn phải thêm tiêu đề "application / json" để tải trọng được ứng dụng khách chấp nhận.
Adam Zuckerman

Tôi đã thiết lập chính xác các tiêu đề trong yêu cầu HTTP của mình. Tuy nhiên, vấn đề có vẻ là server-side: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82

4
Có vẻ như bạn chỉ đặt Accepttiêu đề thành application/json. Bạn cũng cần đặt Content-Typetiêu đề thành application/json.
Brian Rogers

Câu trả lời:


186

Trong yêu cầu HTTP, bạn cần đặt Loại-Nội dung thành: Content-Type: application/json

Vì vậy, nếu bạn đang sử dụng ứng dụng fiddler, hãy thêm Content-Type: application/jsonvào tiêu đề yêu cầu


2
  1. Bạn phải thêm thuộc tính tiêu đề Content-Type:application/json
  2. Khi bạn xác định bất kỳ tham số đầu vào phương thức yêu cầu POST nào sẽ được chú thích là [FromBody], ví dụ :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
    
  3. Mọi dữ liệu đầu vào JSON phải là dữ liệu thô .


1

một mẹo khác ... nơi thêm "content-type: application / json" ... vào trường textbox trên tab Composer / Parsed. Có 3 dòng đã được điền vào đó, vì vậy tôi đã thêm Loại nội dung này làm dòng thứ 4. Điều đó đã làm cho Bài đăng hoạt động.


0

Vui lòng kiểm tra xem bạn có đang chuyển phương thức POSTthay thế hay không GET. nếu vậy bạn sẽ gặp lỗi tương tự như bạn đã đăng ở trên.

$http({               
 method: 'GET',

Tài nguyên này không hỗ trợ loại phương tiện 'văn bản / thuần túy' của thực thể yêu cầu.


1
Câu hỏi cụ thể là về một ĐĂNG http, anh ấy không yêu cầu dữ liệu từ máy chủ mà anh ấy đang gửi dữ liệu đến máy chủ.
War

0

Tôi đã có tất cả các cài đặt của mình trong câu trả lời được chấp nhận. Vấn đề tôi gặp phải là tôi đang cố gắng cập nhật loại thực thể Entity Framework "Tác vụ" như:

public IHttpActionResult Post(Task task)

Điều hiệu quả với tôi là tạo thực thể của riêng tôi "DTOTask" như:

public IHttpActionResult Post(DTOTask task)

0

Nó yêu cầu bao gồm Content-Type:application/jsontrong phần tiêu đề yêu cầu api web khi không đề cập đến bất kỳ nội dung nào thì theo mặc định nó được Content-Type:text/plainchuyển sang yêu cầu.

Cách tốt nhất để kiểm tra api trên công cụ bưu tá.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.