2016-06-30 2 views
1

인해 RFC 7159에 함께 JSON 스트링을 소비 유효한 JSON 문서 일 수있는 문자열 :는 JAX-RS

JSON-text = ws value ws 
... 
value = false/null/true/object/array/number/string 
... 
string = quotation-mark *char quotation-mark 

따라서 유효한 JSON은 "Hello World" 수있다.

JAX-RS에서 이와 같은 JSON 문자열을 사용할 수 있습니까?

@Path("foo") 
public class Foo { 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response biz(String json) { 
     return Response.ok(json).build(); 
    } 
} 

그리고 당신의 요청은 같은 것입니다 :

+0

제 대답이 도움이되는지 알려주세요. –

답변

2

네, 가능합니다

curl -X POST --header 'Content-Type: application/json' \ 
      --header 'Accept: application/json' \ 
      -d '"Hello World"' 'http://localhost:8080/api/foo' 
3

JAX-RS 자원이 있음을 소비 할 수있는 표현의 MIME 미디어 타입을 지정하는 @Consumes 주석이 있습니다 고객이 보냈습니다. 당신이 Content-Type: application/json의 헤더, 당신에게 반환하는 200 OK 상태로 응답 요청을 보내는 경우

@Path("/foo") 
public class FooResource { 

    @POST 
    @Consumes("application/json") 
    public Response bar(InputStream entity) { 
     return Response.ok.build(); 
    } 

} 

: 다음

application/json 미디어 유형의 요청을 수락하는 예입니다. 그러나 헤더가 Content-Type: application/xml 인 요청을 보내면 406 Not Acceptable의 응답이 반환됩니다. @Consumes은 JSON으로 요청을 허용하지만 다른 요청은 허용하지 않기 때문입니다.

@Consumes은 요청 엔터티를 구문 분석하는 방법에 대해주의하고 있지만 받아 들여야하는 미디어 유형을 지정하는 것을 볼 수 있습니다.

위 예제의 매개 변수는 InputStream entity입니다. 그것은 사실 요청 엔터티이다. bar의 리소스 메소드에서 JSON 파서 라이브러리로 구문 분석 할 수 있습니다. Jackson : 당신이 "안녕하세요"의 몸 요청을 보내는 경우

@POST 
@Consumes("application/json") 
public Response bar(InputStream entity) { 
    ObjectMapper mapper = new ObjectMapper(); 
    String json = mapper.readValue(inputStream, String.class); 
    System.out.println(json); 
    return Response.ok.build(); 
} 

, 당신은 당신의 콘솔에 "Hello World"가 표시됩니다. Jackson은 RFC 7159에 지정된 JSON 문서를 구문 분석하는 방법을 알고 있지만 JAX-RS는 구문 분석하지 않는 방법을 알고 있기 때문입니다.

실제로 RESTEasy와 같은 JAX-RS 구현은 이미 널리 사용되는 JSON 구문 분석기 라이브러리로 JSON을 지원합니다. 따라서 다음과 같이 리소스 메소드를 만들면됩니다.

@POST 
@Consumes("application/json") 
public Response bar(String json) { 
    System.out.println(json); 
    return Response.ok.build(); 
} 

같은 결과가 나타납니다.

JAX-RS 뒤에는 HTTP 요청 본문을 Java 객체로 변환하는 MessageBodyReader이 있습니다. 표현으로부터 대응하는 Java 타입에의 매핑 서비스를 제공하는 것은 클래스입니다. 예를 들어 jackson-jaxrs-providers은 JSON 데이터 형식 용 JAX-RS MessageBodyReaderMessageBodyWriter 처리기를 구현합니다.

는 JAX-RS에 대한 자세한 내용은, 당신은 JSR-000339 JAX-RS 2.0 Specification

0

네, 가능성에 모습을 가질 수 있습니다.

클라이언트 측
@POST 
@Consumes(MediaType.APPLICATION_JSON) 
public void example(String s) { ... } 

, JSON으로 인코딩하지 않고, 페이로드를 전송 예 :로

JAX-RS에

는 방법을 정의

var payload = "helloworld"; // OK 
... 

보다는 :

var payload = JSON.stringify("helloworld"); // KO 
... 
관련 문제