>  기사  >  Java  >  Java Jersey2 사용법 요약

Java Jersey2 사용법 요약

高洛峰
高洛峰원래의
2016-12-17 14:47:321486검색

소개

Jersey는 RESTful 웹 서비스 구축을 위한 JAX-RS(JSR311)의 오픈 소스 참조 구현입니다.

코어 서버: JSR 제공 311로 표준화된 API 표준화를 통해 RESTful 웹 서비스를 직관적으로 개발할 수 있습니다.

핵심 클라이언트: Jersey 클라이언트 API는 개발자가 RESTful 서비스와 쉽게 통신할 수 있도록 도와줍니다.

통합: Jersey는 Apache Abdera 라이브러리인 Spring, Guice의 쉬운 상속도 제공합니다.​​ ​

이번 개발에는 Jersey2.0이 사용되었으며, 코어 서버만 사용되었습니다.

Jersey 환경 설정

Maven

org.glassfish.jersey.containers< /groupId> jersey-container-servlet-core 2.0 groupId> javax.xml.ws jaxws-api 2.1< dependency>org.codehaus.jacksonjackson-core-asl1.9.12 groupId> org.codehaus.jackson jackson-mapper-asl 1.9.12org. codehaus.jackson > Jersey 개발 패키지의 다음 라이브러리를 WEB-INF 아래의 라이브러리 디렉터리에 복사합니다.

서버: Jersey-server.jar, Jersey-Container-servlet-core.jar, Jersey-container-servlet.jar , javax.ws.rs-api-2.0.jar

클라이언트: Jersey-client.jar

공통: Jersey-common.jar

json 지원: Jersey2 .0에서는 json을 지원하려면 Jackson1.9가 필요합니다.

Hello World

다음은 Hello World를 보여줍니다

1단계: Http Get 요청을 수락하고 "Hello Jersey"에 응답하는 HelloResource라는 리소스를 작성합니다.

@Path("/hello")public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String sayHello() { return "Hello Jersey"; >2단계: JAX-RS 애플리케이션 작성

public class APIApplication 확장 ResourceConfig {

public APIApplication() { //리소스 로드 레지스터(HelloResource.class) //데이터 변환기 등록 레지스터( JacksonJsonProvider.class) ); // Logging.register(LoggingFilter.class);

}

}

3단계: 목적에 맞게 web.xml 파일에 Servelt 스케줄러를 정의합니다. 모든 REST 요청을 보냅니다. 저지 컨테이너에. Jersey Servlet 선언 외에도 JAX-RS 애플리케이션을 지정하기 위한 초기화 매개변수도 정의해야 합니다.

JerseyServlet org.glassfish.jersey .servlet.ServletContainer javax.ws.rs.Applicationcn.com.mink.resource.APIApplication< ;/param-value> <시작 시 로드>1 JerseyServlet /services/*



4단계: 프로그램 테스트

명령 터미널에 다음 명령어를 입력하면 "Hello Jersey"가 표시됩니다.

curl http://host:port/services/hello

또는 브라우저에 다음 URL을 입력하면 "Hello"가 표시됩니다. Jersey”

http://host:port/services/hello 

리소스 사용

루트 리소스 및 하위 리소스

리소스는 RESTful 서비스의 핵심 부분이며 HTTP 메서드(예: GET, POST, PUT 및 DELETE)를 사용하여 작동할 수 있습니다. JAX-RX에서 리소스는 @Path 주석을 사용하여 식별자를 형성하는 POJO를 통해 구현됩니다. 리소스에는 하위 리소스가 있을 수 있습니다. 상위 리소스는 리소스 컬렉션이고 하위 리소스는 구성원 리소스입니다.

다음 샘플 코드에서

Resources는 "/services" URI로 구성된 컬렉션 리소스이고, UserResource는 "/services/user" URI로 구성된 구성원 리소스입니다.

@Path("/services")public class Resources { @Path("/user") public UserResource getUserResource() { ... } @Path("/book") public BookResource getBookResource() { ... }
}

UserResource는 "/user" URI로 구성된 리소스 모음이고, getUser는 "/user/{username}" URI로 구성된 리소스 메소드입니다

@Path("/ user") public class UserResource { @GET @Path("{username"}) @Produces("application/json") public User getUser(@PathParam("username") String userName) { .. . }
}

HTTP 메서드

HTTP 메서드는 리소스의 CRUD(생성, 읽기, 업데이트 및 삭제) 작업에 매핑됩니다.

HTTP GET : 단일 또는 리소스 모음을 가져오거나 나열하고 검색합니다.

HTTP POST: 새 리소스를 만듭니다.

HTTP PUT: 기존 리소스 또는 리소스 컬렉션을 업데이트합니다.

HTTP DELETE: 리소스 또는 리소스 컬렉션을 삭제합니다.

@Produces

@Produces 주석은 클라이언트에 반환할 데이터 식별 유형(MIME)을 지정하는 데 사용됩니다. @Produces는 클래스 주석 또는 메서드 주석으로 사용될 수 있습니다. 메서드의 @Produces 주석은 클래스 주석을 재정의합니다.

MIME 유형 지정

@Produces("application/json")

여러 MIME 유형 지정

@Produces({"application/json","application/xml"})

@Consumes

@Consumes @ Produces 반대로 클라이언트가 전송할 수 있는 MIME 유형을 지정하는 데 사용됩니다. 클래스나 메소드에도 사용할 수 있으며 일반적으로 @PUT 및 @POST에 사용됩니다.

매개변수 주석

매개변수 주석은 클라이언트가 보낸 데이터를 얻는 데 사용됩니다. 이 문서에서는 일반적으로 사용되는 주석만 소개합니다. 자세한 내용은 Jersey 사용자 설명서

@PathParam

을 참조하세요. @PathParam을 사용하여 URI에 지정된 규칙의 매개변수를 가져옵니다.

@GET @Path("{username"})@Produces(MediaType.APPLICATION_JSON)공개 사용자 getUser(@PathParam("username") String userName) {
...
}

브라우저가 http://localhost/user/jack 을 요청하면 userName 값은 jack입니다.

@QueryParam

@QueryParam은 GET 요청에서 쿼리 매개변수를 가져오는 데 사용됩니다. 예:

@GET@Path("/user")@Produces( "text/ plain")public User getUser(@QueryParam("name") 문자열 이름, @QueryParam("age") int age) {
...
}

브라우저가 http://host:port/user?name=rose&age=25 를 요청할 때 이름 값은 rose이고 age 값은 25입니다. 매개변수의 기본값을 설정해야 하는 경우 다음과 같이 @DefaultValue 를 사용할 수 있습니다.

@GET@Path("/user")@Produces("text/plain")public User getUser( @QueryParam("name" ) 문자열 이름, :port/user?name=rose , 이름 값은 rose이고 age 값은 26입니다.

@FormParam

@FormParam은 이름에서 알 수 있듯이 POST 요청의 양식 매개변수에서 데이터를 가져옵니다. 예:

@POST@Consumes("application/x-www-form-urlencoded")public void post(@FormParam("name") String name) { // 메시지 저장}

@BeanParam

예를 들어 요청 매개변수가 많은 경우 클라이언트는 사용자를 수정하기 위해 PUT 요청을 제출하며 요청에는 많은 사용자 정보 항목이 포함됩니다. 이때 @BeanParam을 사용할 수 있습니다.

@POST@Consumes("application/x-www-form-urlencoded")public void update(@BeanParam User user) { // 사용자 데이터 저장}

User Bean은 다음과 같이 정의됩니다:

@XmlRootElement(name = "user")
public class User { @PathParam("userName) private String userName; @FormParam("name") private String name; @FormParam( "전화") private String Telephone; @FormParam("email") public String getUserName() { return userName; } public void setUserName(String userName);
}

Map 사용

대규모 서버에서는 매개변수 변경으로 인해 위의 방법으로 인해 매개변수 구조 조정에 문제가 발생합니다. , @Context 주석 사용을 고려하고 다음과 같이 UriInfo 인스턴스를 가져올 수 있습니다.

@GET
public String get(@Context UriInfo ui) {
MultivaluedMap .getQueryParameters();
MultivaluedMap pathParams = ui.getPathParameters();
}

은 @Context 주석 ServletConfig , ServletContext , H ttpServletRequest 를 통해 얻을 수도 있습니다. HttpServletResponse 및 HttpHeaders 등은 다음과 같습니다.

@Path("/")public class Resource { @Context HttpServletRequest req; @Context ServletContext servletContext @GET public String get(@Context HttpHeaders) hh) { MultivaluedMap pathParams = hh.getCookies(); }
}

Jersey는 Xml

JAX-RS는 JAXB(Java API for XML Binding)를 사용하여 JavaBeans를 XML 또는 JSON으로 바인딩하거나 그 반대로 바인딩하는 것을 지원합니다. JavaBean에는 @XmlRootElement 주석이 추가되어야 합니다. @XmlElement 주석이 없는 필드에는 다음과 같이 동일한 이름의 XML 요소가 포함됩니다.

@XmlRootElement public class OptionResult { @XmlElement(name = "code") private String result ; private String errorMsg; public String getResult(String result) { this.result = result; } public String getErrorMsg() { return errorMsg) { this. errorMsg = errorMsg; }
}

그런 다음 REST 서비스에서 사용하세요.

@Path("/user")public class UserResource { @POST @Produces(" application/ json") public OptionResult create(@BeanParam User user) { ... }
}

마지막으로 JavaBeans를 json 데이터로 자동 변환하는 데이터 변환기를 등록합니다.

public class APIApplication extends ResourceConfig {
public APIApplication() { //모델 로드 Register(OptionResult.class) //OptionResult와 동일한 패키지로 모델 로드 //packages(OptionResult.class.getPackage () .getName()); //리소스 로드 Register(UserResource.class); //데이터 변환기 등록 Register(JacksonJsonProvider.class); // Logging.register(LoggingFilter.class);
}
}

참고: XML 데이터를 반환하는 원리는 동일하며 데이터 변환기만 다릅니다. 동시에 APIApplication에 XML 데이터 변환기를 등록하면 됩니다.

문제 요약

Ajax 요청(POST, PUT 및 DELETE)이 Jersey 컨테이너에 데이터를 제출할 수 없습니다

문제 설명

SMS 플랫폼 개발 시 데이터의 모든 CRUD는 Ajax 기술을 사용하여 완료되므로 POST, PUT, DELETE 요청을 사용해야 합니다. 이 세 가지 요청의 콘텐츠 유형은 "application/x-www-form-urlencoded"입니다. UTF-8 인코딩을 사용하는 경우 "application/x-www-form-urlencoded; UTF-8"이 됩니다. Firefox의 tamperdata 확장 기능을 사용하여 프로그램을 디버깅하는 과정에서 콘텐츠 유형이 "application/x-www-form-urlencoded"인 경우 Jersey 컨테이너가 @FormParam 주석을 통해 제출된 데이터를 얻을 수 있다는 사실이 발견되었습니다. content-type은 "application/x-www-form-urlencoded; UTF-8"을 얻을 수 없습니다.

해결책

드디어 Java Filter와 Jersey RequestFilter를 사용하여 문제를 해결했습니다. 먼저 Java 필터에서 UTF8을 사용하여 요청의 데이터를 인코딩한 다음 Jersey RequestFilter에서 요청 개체의 콘텐츠 유형을 "application/x-www-form-urlencoded"로 변경합니다. 예:

public void doFilter(ServletRequest 요청, ServletResponse 응답, FilterChain 체인) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; req.setCharacterEncoding("UTF-8");
} public class RequestFilter Implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext context) throws IOException { String headerString = context.getHeaderString("content-type"); if (headerString != null) { //content-type이 "application으로 끝나는 경우" /x -www-form-urlencoded", 그런 다음 if (headerString.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) context.getHeaders().putSingle("content-type", MediaType.APPLICATION_FORM_URLENCODED); } }
}

마지막으로 web.xml에 Java Filter를 등록하고(Jersey 컨테이너 이전에 등록) 다음과 같이 Jersey RequestFilter를 APIApplication에 등록합니다.

public class APIApplication extends ResourceConfig {
public APIApplication () {
register(RequestFilter.class);
}
}

설명

: 이 문제를 해결한 후 Jersey 소스 코드는 Github에 있습니다. 누군가가 이 문제를 발견하고 수정한 것을 창고에서 보았습니다. 자세한 내용은 이 토론


을 참조하세요.

Java Jersey2 사용법 요약과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.