Terjadi kesalahan saat mengirim json dalam POST ke layanan API web

90

Saya membuat layanan web menggunakan API Web. Saya menerapkan kelas sederhana

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

Dan kemudian saya telah menerapkan di dalam pengontrol saya

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

Tetapi ketika saya memanggil API yang meneruskan POST file json:

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

Saya mendapatkan pesan kesalahan berikut:

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

Apa yang saya lakukan salah?

GVillani82
sumber
9
Anda harus menambahkan header "application / json" agar payload dapat diterima dari klien.
Adam Zuckerman
Saya telah menyetel header dengan benar dalam permintaan HTTP saya. Namun masalahnya tampaknya ada di sisi server: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82
4
Sepertinya Anda hanya menyetel Accepttajuk ke application/json. Anda juga perlu menyetel Content-Typetajuk ke application/json.
Brian Rogers

Jawaban:

186

Dalam permintaan HTTP Anda perlu menyetel Jenis Konten ke: Content-Type: application/json

Jadi jika Anda menggunakan klien fiddler, tambahkan Content-Type: application/jsonke header permintaan

beaumondo
sumber
2
  1. Anda harus menambahkan properti header Content-Type:application/json
  2. Saat Anda menentukan parameter input metode permintaan POST yang harus diberi anotasi [FromBody], misalnya :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
    
  3. Setiap data masukan JSON harus berupa data mentah .

Kiran Sagvekar
sumber
1

tip lain ... di mana menambahkan "content-type: application / json" ... ke kolom textbox pada tab Composer / Parsed. Ada 3 baris yang sudah terisi di sana, jadi saya menambahkan Jenis konten ini sebagai baris ke-4. Itu membuat Post bekerja.

john santora
sumber
0

Silakan periksa apakah Anda melewati metode sebagai POSTgantinya GET. jika demikian Anda akan mendapatkan kesalahan yang sama seperti yang Anda posting di atas.

$http({               
 method: 'GET',

Jenis media 'teks / polos' entitas permintaan tidak didukung untuk sumber daya ini.

kondala sudheer
sumber
1
Pertanyaannya secara khusus tentang http POST, dia tidak meminta data dari server yang dia kirim datanya ke server.
Perang
0

Saya memiliki semua pengaturan saya tercakup dalam jawaban yang diterima. Masalah yang saya alami adalah saya mencoba memperbarui jenis entitas Entity Framework "Tugas" seperti:

public IHttpActionResult Post(Task task)

Apa yang berhasil bagi saya adalah membuat entitas saya sendiri "DTOTask" seperti:

public IHttpActionResult Post(DTOTask task)
Michael Washington
sumber
0

Itu perlu disertakan Content-Type:application/jsondalam bagian header permintaan api web ketika tidak menyebutkan konten apa pun maka secara default itu Content-Type:text/plainditeruskan ke permintaan.

Cara terbaik untuk menguji api di alat tukang pos.

Kiran Sagvekar
sumber