소개
Jersey는 RESTful 웹 서비스 구축을 위한 JAX-RS(JSR311)의 오픈 소스 참조 구현입니다.
코어 서버: JSR 제공 311로 표준화된 API 표준화를 통해 RESTful 웹 서비스를 직관적으로 개발할 수 있습니다.
핵심 클라이언트: Jersey 클라이언트 API는 개발자가 RESTful 서비스와 쉽게 통신할 수 있도록 도와줍니다.
통합: Jersey는 Apache Abdera 라이브러리인 Spring, Guice의 쉬운 상속도 제공합니다.
이번 개발에는 Jersey2.0이 사용되었으며, 코어 서버만 사용되었습니다.
Jersey 환경 설정
Maven
public APIApplication() { //리소스 로드 레지스터(HelloResource.class) //데이터 변환기 등록 레지스터( JacksonJsonProvider.class) ); // Logging.register(LoggingFilter.class);
}}
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
MultivaluedMap
}
은 @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
}
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 중국어 웹사이트를 주목하세요!