2015-12-16 16 views
5

में जेएसओएन के रूप में 'टेक्स्ट/सादा' को अनमशॉल कैसे करें मैं एक विरासत HTTP API (जिसे मैं नहीं बदल सकता) के साथ काम कर रहा हूं जो शरीर में JSON के साथ प्रतिक्रिया करता है, लेकिन Content-Type: text/plain; charset=utf-8 शीर्षलेख देता है।अक्का HTTP

मैं JSON के रूप में जो HTTP शरीर unmarshall करने का प्रयास कर रहा हूँ, लेकिन मैं निम्नलिखित अपवाद: akka.http.scaladsl.unmarshalling.Unmarshaller$UnsupportedContentTypeException: Unsupported Content-Type, supported: application/json

मेरे कोड इस तरह दिखता है:

import spray.json.DefaultJsonProtocol 
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ 
import akka.http.scaladsl.unmarshalling._ 

case class ResponseBody(status: String, error_msg: String) 

object ResponseBodyJsonProtocol extends DefaultJsonProtocol { 
    implicit val responseBodyFormat = jsonFormat2(ResponseBody) 
} 

def parse(entity: HttpEntity): Future[ResponseBody] = { 
    implicit val materializer: Materializer = ActorMaterializer() 
    import ResponseBodyJsonProtocol._ 
    Unmarshal[HttpEntity](entity).to[ResponseBody] 
} 

एक नमूना HTTP प्रतिक्रिया इस प्रकार है:

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Encoding: gzip 
Content-Length: 161 
Content-Type: text/plain; charset=utf-8 
Date: Wed, 16 Dec 2015 18:15:14 GMT 
Server: Microsoft-IIS/7.5 
Vary: Accept-Encoding 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 

{"status":"1","error_msg":"Missing parameter"} 

HTTP प्रतिक्रिया में Content-Type को अनदेखा करने और JSON के रूप में पार्स को अनदेखा करने के लिए मैं क्या कर सकता हूं?

उत्तर

6

एक वैकल्पिक हल मैंने पाया बस मैन्युअल रूप से इसे unmarshalling से पहले HttpEntity पर Content-Type स्थापित करने के लिए किया गया था:

def parse(entity: HttpEntity): Future[ResponseBody] = { 
    implicit val materializer: Materializer = ActorMaterializer() 
    import ResponseBodyJsonProtocol._ 
    Unmarshal[HttpEntity](entity.withContentType(ContentTypes.`application/json`)).to[ResponseBody] 
} 

ठीक काम करने के लिए लगता है, लेकिन मैं अन्य विचारों के लिए खुला रहा हूँ ...

+0

मुझे एक ही समस्या थी और Unmarshalling के लिए कोड की अपनी अंतिम पंक्ति का उपयोग किया। किसी कारण से withContentType इकाई को बदल देता है और इसे एक सख्त इकाई में बदल देता है जिसमें सामग्री प्रकार वस्तु भी होती है। उस से शरीर निकालने के बारे में कोई विचार? –

2

मैं map... निर्देश का उपयोग करें। यह छोटा और सुरुचिपूर्ण दिखता है।

val routes = (decodeRequest & encodeResponse) { 
    mapResponseEntity(_.withContentType(ContentTypes.`application/json`)) { 
    nakedRoutes ~ authenticatedRoutes 
    } 
} 
+0

मुझे यकीन नहीं है कि यह लागू होता है .... मेरे मामले में कोई रूटिंग नहीं चल रही है, और मैं निश्चित रूप से नहीं देखता कि यह मेरे उत्तर से छोटा या अधिक सुरुचिपूर्ण है। हालांकि वही विचार है। –

+1

ओह हाँ, यदि आप स्प्रे डीएसएल का उपयोग नहीं करते हैं तो यह लागू नहीं होता है। – expert

संबंधित मुद्दे