development

Jersey를 사용하여 전체 REST 요청 본문을 얻는 방법은 무엇입니까?

big-blog 2020. 12. 11. 19:08
반응형

Jersey를 사용하여 전체 REST 요청 본문을 얻는 방법은 무엇입니까?


POSTJersey를 사용하여 요청에 대한 전체 HTTP REST 요청 본문을 얻으려면 어떻게 해야합니까?

우리의 경우 데이터는 XML입니다. 크기는 1K에서 1MB까지 다양합니다.

워드 프로세서 사용한다을 시사 MessageBodyReader하지만 예제를 볼 수 없습니다.


많은 일을 할 필요가 없다는 것이 밝혀졌습니다.

아래 참조-매개 변수 x는 전체 HTTP 본문 (이 경우 XML)을 포함합니다.

@POST
public Response go(String x) throws IOException {
    ...
}

@Consumes 주석을 사용하여 전체 본문을 가져올 수 있습니다.

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;

@Path("doc")
public class BodyResource
{
  @POST
  @Consumes(MediaType.APPLICATION_XML)
  public void post(Document doc) throws TransformerConfigurationException, TransformerException
  {
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.transform(new DOMSource(doc), new StreamResult(System.out));
  }
}

참고 : 요청에서 "Content-Type : application / xml"헤더를 잊지 마십시오.


이 단일 코드를 사용하여 시도하십시오.

import javax.ws.rs.POST;
import javax.ws.rs.Path;

@Path("/serviceX")
public class MyClassRESTService {

    @POST
    @Path("/doSomething")   
    public void someMethod(String x) {

        System.out.println(x);
                // String x contains the body, you can process
                // it, parse it using JAXB and so on ...

    }
}

try rest 서비스의 URL이 종료됩니다. .... / serviceX / doSomething


xml로 데이터를 전송하고 있으므로 pojo에서 직접 마샬링 할 수도 있습니다.

jersey 사용자 가이드 에 예제 (및 추가 정보)가 있으며 여기에 복사합니다.

JAXB 주석이있는 POJO :

@XmlRootElement
public class Planet {
    public int id;
    public String name;
    public double radius;
}

자원:

@Path("planet")
public class Resource {

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Planet getPlanet() {
        Planet p = new Planet();
        p.id = 1;
        p.name = "Earth";
        p.radius = 1.0;

        return p;
    }

    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public void setPlanet(Planet p) {
        System.out.println("setPlanet " + p.name);
    }

}      

생성 / 소비되는 xml :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<planet>
    <id>1</id>
    <name>Earth</name>
    <radius>1.0</radius>
</planet>

MessageBodyReader여기 를 사용해야 할 것 같습니다 . 다음은 jdom을 사용하는 예입니다.

import org.jdom.Document;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.MediaType;
import javax.ws.rs.ext.MultivaluedMap;
import java.lang.reflect.Type;
import java.lang.annotation.Annotation;
import java.io.InputStream;

@Provider // this annotation is necessary!
@ConsumeMime("application/xml") // this is a hint to the system to only consume xml mime types
public class XMLMessageBodyReader implements MessageBodyReader<Document> {
  private SAXBuilder builder = new SAXBuilder();

  public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) {
    // check if we're requesting a jdom Document
    return Document.class.isAssignableFrom(type);
  }

  public Document readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) {
    try {
      return builder.build(entityStream);
    }
    catch (Exception e) {
      // handle error somehow
    }
  } 
}

저지 배포가 처리 할 리소스 목록에이 클래스를 추가합니다 (일반적으로 web.xml을 통해 구성됨). 그런 다음 다음과 같은 일반 리소스 클래스 중 하나에서이 리더를 사용할 수 있습니다.

@Path("/somepath") @POST
public void handleXMLData(Document doc) {
  // do something with the document
}

이것이 입력 한대로 정확히 작동하는지 확인하지 않았지만 그게 요점입니다. 여기에서 더 많은 읽기

참고 URL : https://stackoverflow.com/questions/1725315/how-to-get-full-rest-request-body-using-jersey

반응형