เกิดข้อผิดพลาดในการส่ง json ในบริการ POST ไปยังเว็บ API


90

ฉันกำลังสร้างบริการเว็บโดยใช้ Web API ฉันใช้คลาสง่ายๆ

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

จากนั้นฉันได้ติดตั้งภายในคอนโทรลเลอร์ของฉัน

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

แต่เมื่อฉันเรียก API ผ่านใน POST ไฟล์ 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" เพื่อให้ payload ได้รับการยอมรับจากไคลเอนต์
Adam Zuckerman

ฉันตั้งค่าส่วนหัวในคำขอ HTTP อย่างถูกต้องแล้ว อย่างไรก็ตามปัญหาดูเหมือนจะเป็นฝั่งเซิร์ฟเวอร์: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82

4
ดูเหมือนว่าคุณจะตั้งค่าAcceptส่วนหัวเป็นapplication/jsonเท่านั้น นอกจากนี้คุณยังจำเป็นต้องตั้งค่าส่วนหัวContent-Type application/json
Brian Rogers

คำตอบ:


186

ในคำขอ HTTP คุณต้องตั้งค่า Content-Type เป็น: Content-Type: application/json

ดังนั้นหากคุณกำลังใช้ไคลเอนต์ fiddler 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

เคล็ดลับอื่น ... ที่จะเพิ่ม "content-type: application / json" ... ลงในช่อง textbox บนแท็บ Composer / Parsed มี 3 บรรทัดเต็มไปแล้วดังนั้นฉันจึงเพิ่ม Content-type นี้เป็นบรรทัดที่ 4 นั่นทำให้โพสต์ทำงาน


0

โปรดตรวจสอบว่าคุณกำลังถูกส่งผ่านวิธีการเป็นแทนที่จะเป็นPOST GETหากเป็นเช่นนั้นคุณจะได้รับข้อผิดพลาดเช่นเดียวกับที่คุณโพสต์ไว้ด้านบน

$http({               
 method: 'GET',

ไม่รองรับประเภทสื่อของเอนทิตี 'text / plain' สำหรับทรัพยากรนี้


1
คำถามนี้เกี่ยวกับ http POST โดยเฉพาะเขาไม่ได้ร้องขอข้อมูลจากเซิร์ฟเวอร์ที่เขาส่งข้อมูลไปยังเซิร์ฟเวอร์
สงคราม

0

ฉันครอบคลุมการตั้งค่าทั้งหมดของฉันในคำตอบที่ยอมรับแล้ว ปัญหาที่ฉันพบคือฉันพยายามอัปเดตเอนทิตี Entity Framework ประเภท "งาน" เช่น:

public IHttpActionResult Post(Task task)

สิ่งที่ได้ผลสำหรับฉันคือการสร้างเอนทิตี "DTOTask" ของตัวเองเช่น:

public IHttpActionResult Post(DTOTask task)

0

จำเป็นต้องรวมContent-Type:application/jsonไว้ในส่วนส่วนหัวของคำขอ web api เมื่อไม่ได้กล่าวถึงเนื้อหาใด ๆ โดยค่าเริ่มต้นจะถูกContent-Type:text/plainส่งไปยังคำขอ

วิธีที่ดีที่สุดในการทดสอบ api บนเครื่องมือบุรุษไปรษณีย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.