2014-07-24 13 views
13

Utworzono usługę sieciową REST, używając jax-rs i jersey, które mają zużywać JSON na żądanie POST. Moja klasa serwis internetowy wygląda następująco:Usługa REST wracająca do sieci 415 - Nieobsługiwany nośnik Typ

@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; 

    } 

} 

moja klasa Song:

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; } 

} 

moim web.xml (w razie potrzeby)

<?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> 

Używam RESTClient trochę, dobrze , odpocznij klientowi ... Oto zrzut ekranu z tego, co wysyłam:

enter image description here

Po wysłaniu tego komunikatu pojawia się błąd 415 Nieobsługiwany nośnik typu. Ktoś ma pomysł, dlaczego?

+1

Czy klient wysyła nagłówek 'Content-Type: application/json'? – lefloh

+0

Wiesz, co może być prawdą. Pozwól mi zobaczyć – Tiwaz89

+0

@lefloh - Jesteś zwycięzcą! Miałeś rację, nawet nie wiedziałem, że musisz to ustawić w tych małych aplikacjach klienckich. Możesz pisać jako odpowiedź, a ja to zaakceptuję. Dzięki! – Tiwaz89

Odpowiedz

33

Należy wysłać nagłówek żądania Content-Type: application/json. Wygląda na to, że REST-Client nie doda automatycznie tego nagłówka.

+0

Jak programowo dodawać typ zawartości w Androidzie – Sarvesh

0

Może to być spowodowane tym, że nie określono ścieżki funkcji API. Ścieżka zasobów została podana tylko w kodzie.

+0

O ile mi wiadomo, jest to opcjonalne, ale nie wymagane. Spróbuję jednak, czy nie. – Tiwaz89

0

staram się dodać

@Produces({"application/json"}) 

do moich usług w stosunku do deklaracji klasy najwyższego poziomu i zastąpić w razie potrzeby.

np.

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

Jak inni podkreślili, brakuje właściwego nagłówka. Dodaj Content-Type: application/json do "nagłówków": enter image description here

2

Miałem ten sam 415 czas błędu http temu. Po prostu zapomniałem domyślnego konstruktora bez parametrów w moich klasach DTO. Dodanie tego konstruktora, podobnie jak w przypadku encji JPA, rozwiązało mój problem i odszyfrowanie JSON->Object działa teraz.

Nie jestem pewien, czy to jest twój przypadek, patrząc na twój kod, ale może być przydatny dla innych facetów, którzy tu wpadają, patrząc na problem 415 + JSON. Pozdrawiam

+1

Twoja odpowiedź pozwoliła mi zaoszczędzić sporo debugowania: D –

+0

Serdecznie zapraszamy :-) –

Powiązane problemy