2014-07-24 16 views
13

मैंने जेएक्स-आरएस और जर्सी का उपयोग करके एक आरईएसटी वेब सेवा बनाई है जिसे पीएसटी अनुरोध पर जेएसओएन का उपभोग करना है। मेरे वेब सेवा वर्ग इस तरह दिखता है:आरईएसटी वेबसाइट सेवा 415 लौटा रही है - असमर्थित मीडिया प्रकार

@Path("/webhookservice") 
public class Webhook { 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response readData (Song song) { 

     // Prints out the song info 
     System.out.println("SONG INFO \n======================="); 
     System.out.println("songname: " + song.getSongname()); 
     System.out.println("artist: " + song.getArtist()); 

     // Repsonse with a HTTP 200 OK 
     Response response = Response.status(200).build(); 
     return response; 

    } 

} 

मेरे गाने के वर्ग:

public class Song { 

    private String songname; 
    private String artist; 

    public String getSongname() { return this.songname; } 
    public String getArtist() { return this.artist; } 

    public void setSongname (String songname) { this.songname = songname; } 
    public void setArtist (String artist) { this.artist = artist; } 

} 

मेरे web.xml (यदि आवश्यक हो)

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 

    <servlet> 
     <servlet-name>SnapScan-Webhook</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>za.co.lancet.service</param-value> 
     </init-param> 
     <init-param> 
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>SnapScan-Webhook</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

मैं RESTClient एक छोटे से उपयोग कर रहा हूँ, अच्छी तरह से , बाकी ग्राहक ... मैं जो भेज रहा हूं उसका एक स्क्रीनशॉट यहां है:

enter image description here

जब मैं इसे भेजता हूं, तो मुझे 415 असमर्थित मीडिया प्रकार त्रुटि मिलती है। किसी के पास कोई विचार क्यों है?

+1

क्या ग्राहक शीर्षलेख 'सामग्री-प्रकार: एप्लिकेशन/जेसन' भेज रहा है? – lefloh

+0

आप जानते हैं कि आप सही क्या हो सकते हैं। मुझे – Tiwaz89

+0

@lefloh देखें - आप विजेता हैं! आप सही थे, मुझे यह भी नहीं पता था कि आपको इन छोटे क्लाइंट ऐप्स में सेट करने की आवश्यकता है। आप एक उत्तर के रूप में पोस्ट कर सकते हैं और मैं स्वीकार करूंगा। धन्यवाद! – Tiwaz89

उत्तर

33

आपको अनुरोध-हेडर Content-Type: application/json भेजने की आवश्यकता है। ऐसा लगता है कि REST-Client आपके लिए यह हेडर स्वचालित रूप से नहीं जोड़ता है।

+0

एंड्रॉइड – Sarvesh

0

ऐसा इसलिए हो सकता है क्योंकि आपने API फ़ंक्शन के लिए पथ निर्दिष्ट नहीं किया है। आपने केवल अपने कोड में संसाधन पथ निर्दिष्ट किया है।

@POST 
@Path("/somepath") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response readData (Song song) { 
    ... 
} 
+0

जहां तक ​​मुझे पता है कि यह वैकल्पिक है लेकिन आवश्यक नहीं है। मैं इसे फिर से कोशिश करूंगा – Tiwaz89

0

मैं शीर्ष स्तर के कक्षा घोषणा के खिलाफ अपनी सेवाओं के लिए

@Produces({"application/json"}) 

जोड़ सकते हैं और ओवरराइड जहां उपयुक्त हो जाते हैं।

उदा।

@Path("/foo") 
@Produces({"application/json"}) 
public class FooRestService { 
6

जैसा कि अन्य ने बताया है, आप सही शीर्षलेख खो रहे हैं। Content-Type: application/json "हेडर" में जोड़ें: enter image description here

2

मैं एक ही 415 http त्रुटि समय पहले किया था। मैं बस अपने डीटीओ कक्षाओं में डिफ़ॉल्ट नो-पैरामीटर कन्स्ट्रक्टर भूल गया। उस कन्स्ट्रक्टर को जोड़कर, जेपीए इकाइयों के समान तरीके से, मेरी समस्या हल हो गई और डी-सीरियलाइजेशन JSON->Object अब काम करता है।

मुझे यकीन नहीं है कि यह आपका मामला है, आपका कोड देख रहा है, लेकिन यह 415 + जेएसओएन मुद्दे को देखकर यहां गिरने वाले अन्य लोगों के लिए उपयोगी हो सकता है। सम्मान

+1

में सामग्री प्रकार को प्रोग्रामेटिक रूप से कैसे जोड़ें आपके उत्तर ने मुझे बहुत सी डिबगिंग सहेजी: डी –

+0

आपका स्वागत है :-) –

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