POST'ta json'u web API hizmetine gönderme hatası


90

Web API kullanarak bir web hizmeti oluşturuyorum. Basit bir sınıf uyguladım

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

Ve sonra denetleyicimin içine uyguladım

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

Ancak POST'ta geçen API'yi çağırdığımda json dosyası:

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

Aşağıdaki hata mesajını alıyorum:

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

Neyi yanlış yapıyorum?


9
Yükün istemciden kabul edilmesi için bir "application / json" başlığı eklemeniz gerekir.
Adam Zuckerman

HTTP isteğimdeki başlıkları doğru bir şekilde ayarladım. Ancak sorun sunucu tarafında görünüyor: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82

4
Görünüşe göre sadece Acceptbaşlığı ayarlıyorsunuz application/json. Ayrıca Content-Typebaşlığı olarak ayarlamanız gerekir application/json.
Brian Rogers

Yanıtlar:


186

HTTP isteğinde İçerik Türünü şu şekilde ayarlamanız gerekir: Content-Type: application/json

Yani eğer fiddler istemcisi kullanıyorsanız Content-Type: application/jsonistek başlığına ekleyin


2
  1. Başlık özelliği eklemelisiniz Content-Type:application/json
  2. Açıklanması gereken herhangi bir POST istek yöntemi girdi parametresi tanımladığınızda [FromBody], örneğin :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
    
  3. JSON giriş verilerinin tümü ham veri olmalıdır .


1

başka bir ipucu ... Composer / Parsed sekmesindeki metin kutusu alanına "content-type: application / json" ... ekleneceği yer. Orada zaten doldurulmuş 3 satır var, bu yüzden bu İçerik türünü 4. satır olarak ekledim. Bu, Post'un çalışmasını sağladı.


0

Lütfen POSTbunun yerine yöntemi geçip geçmediğinizi kontrol edin GET. eğer öyleyse, yukarıda yayınladığınızla aynı hatayı alırsınız.

$http({               
 method: 'GET',

İstek varlığının medya türü "metin / düz" bu kaynak için desteklenmiyor.


1
Soru özellikle bir http POST ile ilgili, sunucuya veri gönderdiği sunucudan veri istemiyor.
Savaş

0

Tüm ayarlarımı kabul edilen cevapta kapladım. Karşılaştığım sorun, Entity Framework varlık türünü "Görev" gibi güncellemeye çalışmamdı:

public IHttpActionResult Post(Task task)

Benim için işe yarayan şey, kendi varlığım olan "DTOTask" ı şöyle oluşturmaktı:

public IHttpActionResult Post(DTOTask task)

0

Content-Type:application/jsonHerhangi bir içerikten bahsetmediğinde web api istek başlığı bölümüne dahil edilmesi gerekir ve varsayılan Content-Type:text/plainolarak isteğe geçer.

Postacı aracında api'yi test etmenin en iyi yolu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.