2014-06-20 24 views
6

Gerçekten bir şeyle uğraşmak, buradaki insanların yardımcı olabileceğini umuyorum. Web API 2'de RESTful API'sı yazıyorum. Bu hizmete bir istek gönderdiğimde, yanıt her zaman Content-Typetext/plain ile gönderiliyor. Açıkçası bu iyi değil, cevabımın application/json olması gerekiyor. Google'dan bulduğum birkaç öneride bulundum, ancak resmin tamamını anlamıyorum.Web API 2 dönen metin/normal yanıtlar

Web hizmetimin application/json içeriğiyle yanıt vermesi için özel olarak yapmam gereken bir şey var mı? Bunun tüm uygulama genelinde global olarak çalışmasını istediğimi, bu yüzden belirli bir yanıtı değiştirip içerik türünü ayarlamanın bir yolu olmadığından emin değilim - Bunun tüm web hizmeti için varsayılan bir davranış olmasını istiyorum: Bir istek içeriyorsa için bir başlığı text/plain yerine web hizmetimin Content-Type döndürmesini istiyorum.

Düzenleme netleştirmek için:

My tepki JSON içine tefrika ve vücutta dahil edilmelidir "responseData" adlı bir nesne içerir. Şu anda böyle benim yanıtı kuruyorum:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, responseData); 
return response; 

responseData bir POCO olduğunu. Bu get JSON olarak doğru bir şekilde serileştirildi ve yanıtta geri döndü - tek eksik parça yanlış "text/plain" olarak ayarlanmış Content-Type. Bunu oluşturduğum her yanıtta el ile değiştirebilirdim, ancak bunu global düzeyde yapılandırmak istiyorum.

+0

Söz konusu API, kendiniz oluşturduğunuz JSON içeriğiyle bir "dize" döndürüyor mu? – Corey

+0

Bu http://www.asp.net/web-api/overview/formats-and-model-binding/content-negotiation adresini ziyaret edin: http://msdn.microsoft.com/en-us/magazine/dn574797.aspx http: //blogs.msdn.com/b/henrikn/archive/2012/04/22/asp-net-web-api-content-negotiation-and-accept-charset.aspx, – malkam

+0

@Corey şu anda yanıt bu şekilde yaratıldı: 'HttpResponseMessage response = Request.CreateResponse (HttpStatusCode.OK, responseData);' ve sonra da 'yanıtımı geri döndürüyorum'. ResponseData içeriği JSON içine serileştirilmekte, ancak asıl içerik tipi başlık hala text/plain olarak ayarlanmıştır :( –

cevap

7

Tamam, responseData kodunuzun bir dize olduğu varsayılırsa, HttpResponseMessage'u oluştururken Content-type başlığı text/plain olacaktır. Dizgenin içeriğinin ne olduğu önemli değildir, çünkü bunu belirlemek için hiçbir girişimde bulunulmamıştır.

çözümü getiriyorduk ortam türü ile başlatıldı mesajınız için uygun içerik nesnesini oluşturmaktır:

belirli bir nesne türü dönen ve API icar için bu miktarın diğer yöntemler vardır
HttpResponseMessage response = new HttpResponseMessage() 
    { 
     Content = new StringContent(
       responseData, 
       Encoding.UTF8, 
       "application/json" 
      ) 
    }; 

Kütüphaneler gerektiği gibi sizin için JSON veya XML olarak serileştirir. Mümkün olan yerlerde çerçevenin benim için çalışmasına izin vermeyi tercih ederim, ancak bunu kendiniz oluşturduğunuz bir dizeyle nasıl başaracağınız budur.


sıkı JSON sadece sonuç için, WebAPI yapılandırmasından XML biçimlendirici çıkarın ve POCO dönün.

config.Formatters.Remove(config.Formatters.XmlFormatter); 

Ve API: Ben bu kadar koştu ve Chrome'dan /api/Test talep

public class MyObject 
{ 
    public bool result; 
    public string reason; 
} 

public class TestController : ApiController 
{ 
    public MyObject GetData() 
    { 
     MyObject result = new MyObject { result = "true", reason = "Testing POCO return" }; 
     return result; 
    } 
} 

bile söz etmez App_Start\WebApiConfig.cs yılında

, WebApiConfig.Register yöntemine aşağıdakileri ekleyin başlığında application/json.o Content-Type vurur kadar buradayız tepki yukarı başlıklarını:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 

Ve cesedi:

{"result":true,"reason":"Testing POCO return"} 

JSON varsayılan ayarı Devre dışı XML beri.

+0

Soruda da belirtildiği gibi, küresel bir yol bulmaya çalışıyorum. Oluşturduğum her yanıt için İçerik Türü'nü açık bir şekilde tanımlamaktan ziyade, bunu ayarladım. İfadelerim biraz belirsizdi - OP'imi birkaç noktaya açıklığa kavuşturmak için düzenledim. –

+0

Nesnenin kendisini döndürmeyi denediniz mi? ? HttpResponseMessage, bireysel dönüşler üzerinde daha fazla kontrol istediğinizde iyidir, ancak bir POCO'yu döndürebilir ve kütüphanelerin sizin için serileştirme işlemine izin verebilirsiniz - JSON veya XML, istekte eader. – Corey

+0

Sanırım sorun şu ki, eğer bir şey yanlış giderse, 404'leri veya 500'leri vs. döndürme ihtiyacım var - bu, açıklanan yaklaşımı kullanarak hala mümkün mü? –

0

Aşağıdakileri Global.asax dosyasına ekleyin.

protected void Application_Start() 
{ 

JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); 
serializerSettings.Converters.Add(new IsoDateTimeConverter()); 
var jsonFormatter = new JsonNetFormatter(serializerSettings); 
jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
GlobalConfiguration.Configuration.Formatters.Insert(0, jsonFormatter); 

} 
+0

Bu, bir kimsenin bir JsonNetFormatter'i oluşturduğunu varsayıyor ve bu anlayış veya daha fazla ayrıntı olmadan çalışmaz. – Suamere

0

açıklanan konunun bir diğer olası kaynak bizim için olduğu gibi oyunda yönlendirmek bir yetkilendirme olabileceğini olduğunda bir API için kullanıcı kimlik doğrulaması yeniden kullanımı düşünülen mühendislerden biri. Bu, gelen isteklerin, ReadAsync<> tarafından ayrıştırılamayan text/html yanıtı olan bir giriş sayfasına yönlendirildiği anlamına gelir. Bu, ReadAsync<>. Emin olmak için aptalca bir hata, ama kolay bir tane değil. Bu durumda çözüm, kullanıcı kimlik doğrulamasını kaldırmak ve api için HMAC tabanlı kimlik doğrulamasını uygulamaktır.

İlgili konular