2014-07-24 3 views
13

POST 요청시 JSON을 사용하는 jax-rs 및 jersey를 사용하여 REST 웹 서비스를 만들었습니다. 내 웹 서비스 클래스는 다음과 같습니다REST 웹 서비스 반환 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

클라이언트가 'Content-Type : application/json' 헤더를 보내고 있습니까? – 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 오류 시간 전을 가졌습니다. 내 DTO 클래스에서 기본 no-parameters 생성자를 잊어 버렸습니다. JPA 엔티티와 비슷한 방식으로 해당 생성자를 추가하면 내 문제가 해결되고 비 순차화 JSON->Object이 작동합니다.

코드를 보면 이것이 확실하지 않지만 415 + JSON 문제를보고있는 다른 사람들에게 유용 할 수 있습니다. 감사합니다.

+1

당신의 답은 저에게 많은 디버깅을 저장했습니다 : D –

+0

당신은 환영합니다 :-) –

관련 문제