Jersey 프레임 워 크 1: Jersey RESTful WebService 프레임 워 크 소개
11561 단어 WebServiceRESTfulJersey
Jersey 프레임 워 크 1: Jersey RESTful WebService 프레임 워 크 소개
Jersey 프레임 워 크 2: Jersey 의 JSON 지원
Jersey 프레임 워 크 3: Jersey 의 HTTPS 지원
RESTful WebService 를 개발 하 는 것 은 다양한 미디어 유형 과 추상 적 인 바 텀 클 라 이언 트 - 서버 통신 디 테 일 을 지원 하 는 것 을 의미 합 니 다. 좋 은 공구 꾸러미 가 사용 되 지 않 으 면 어 려 운 작업 입 니 다.
JAVA 를 이용 하여 RESTful WebService 와 클 라 이언 트 를 개발 하 는 것 을 간소화 하기 위해 경량급 기준 이 제시 되 었 다. JAX - RS API
Jersey RESTful WebService 프레임 워 크 는 오픈 소스, 제품 등급 의 JAVA 프레임 워 크 로 JAX - RS API 를 지원 하 며 JAX - RS (JSR 311 과 JSR 339) 의 참고 실현 입 니 다.
Jersey 는 JAX - RS 의 참고 실현 뿐만 아니 라 Jersey 는 자신의 API 를 제공 합 니 다. 그 API 는 JAX - RS 에서 계승 하여 더 많은 특성 과 기능 을 제공 하여 RESTful service 와 클 라 이언 트 의 개발 을 더욱 간소화 합 니 다.
Maven 버 전: 3.1.0
Jersey 버 전: 1.18
JDK 버 전: 1.7.065
서버
Maven 설정 은 다음 과 같 습 니 다:
4.0.0
JERSEY_SERVER
JERSEY_SERVER
1.0
com.sun.jersey
jersey-server
1.18
com.sun.jersey
jersey-grizzly2
1.18
먼저 몇 가지 주 해 를 소개 합 니 다.
@Path
자원 클래스 나 방법 으로 URI 를 정의 하 는 데 사 용 됩 니 다. 물론 정적 URI 뿐만 아니 라 동적 URI 도 지원 합 니 다.
@Path("service")
public class MyResource {
@Path("{sub_path}")
@GET
public String getResource(@PathParam("sub_path") String resourceName) {
......
클 라 이언 트 가 요청 한 URI 는http://127.0.0.1:10000/service/sean, subpath 의 값 은 sean 입 니 다.
@ PathParam 은 URI 요청 의 일 부 를 방법 매개 변수 로 전송 하 는 데 사 용 됩 니 다.
URI 의 동적 부분 에 대해 서 는 정규 표현 식 을 사용자 정의 할 수 있 습 니 다. 인자 검증 을 요청 하 는 데 실 패 했 을 경우 용 기 는 404 Not Found 를 되 돌려 줍 니 다.
@Path("{sub_path:[A-Z]*}")
@GET
주 해 를 표시 하 는 방법 은 HTTP GET 요청 에 응답 합 니 다. @ POST, @ PUT 와 @ DELETE 는 같 습 니 다.
@Consumes
요청 한 미디어 종 류 를 정의 합 니 다. 지정 하지 않 으 면 용 기 는 기본적으로 임의의 미디어 종 류 를 받 아들 일 수 있 습 니 다. 용 기 는 호출 된 방법 으로 HTTP 요청 을 받 아들 일 수 있 는 미디어 종 류 를 확인 합 니 다. 그렇지 않 으 면 415 Unsupported Media Type 으로 돌아 갑 니 다.
방법 급 주 해 는 클래스 급 주 해 를 덮어 씁 니 다.
@Produces
응답 미디어 종 류 를 정의 합 니 다. 지정 하지 않 으 면 용 기 는 기본적으로 임의의 미디어 종 류 를 받 아들 일 수 있 습 니 다. 용 기 는 호출 된 방법 을 확인 하고 HTTP 요청 을 받 아들 일 수 있 습 니 다. 그렇지 않 으 면 406 Not Acceptable 로 돌아 갑 니 다.
방법 급 주 해 는 클래스 급 주 해 를 덮어 씁 니 다.
@QueryParam
public String getResource(
@DefaultValue("Just a test!") @QueryParam("desc") String description) {
......
}
요청 URI 에 desc 인자 가 포함 되 어 있다 면, 예 를 들 어:http://127.0.0.1:10000/service/sean?desc=123456, desc 매개 변수의 값 은 방법의 매개 변수 description 에 부 여 됩 니 다. 그렇지 않 으 면 방법 매개 변수 description 의 값 은 @ DefaultValue 주석 으로 정 의 된 기본 값 입 니 다.
@Context
요청 이나 응답 과 관련 된 클래스 에 정 보 를 주입 합 니 다. 주입 가능 한 클래스 는 애플 리 케 이 션, UriInfo, Request, HttpHeaders 와 Security Context 입 니 다.
@ Singleton 과 @ PerRequest
기본 적 인 상황 에서 자원 류 의 생명 주 기 는 per - request 입 니 다. 즉, 시스템 은 모든 자원 류 URI 와 일치 하 는 요청 에 인 스 턴 스 를 만 듭 니 다. 이러한 효율 이 낮 습 니 다. 자원 류 에 대해 @ Singleton 주 해 를 사용 할 수 있 습 니 다. 이렇게 하면 응용 범위 내 에서 자원 류 의 인 스 턴 스 만 만 만 만 들 수 있 습 니 다.
서버 프로그램 은 다음 과 같 습 니 다.
package com.sean;
import java.io.IOException;
import java.net.URI;
import java.util.Iterator;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import org.glassfish.grizzly.http.server.HttpServer;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.spi.resource.Singleton;
@Singleton
@Path("service")
public class MyResource {
@Path("{sub_path:[a-zA-Z0-9]*}")
@GET
@Consumes({MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON})
@Produces(MediaType.TEXT_PLAIN)
public String getResourceName(
@PathParam("sub_path") String resourceName,
@DefaultValue("Just a test!") @QueryParam("desc") String description,
@Context Request request,
@Context UriInfo uriInfo,
@Context HttpHeaders httpHeader) {
System.out.println(this.hashCode());
// HTTP
System.out.println("****** HTTP request ******");
StringBuilder strBuilder = new StringBuilder();
strBuilder.append(request.getMethod() + " ");
strBuilder.append(uriInfo.getRequestUri().toString() + " ");
strBuilder.append("HTTP/1.1[\\r\
]");
System.out.println(strBuilder.toString());
MultivaluedMap headers = httpHeader.getRequestHeaders();
Iterator iterator = headers.keySet().iterator();
while(iterator.hasNext()){
String headName = iterator.next();
System.out.println(headName + ":" + headers.get(headName) + "[\\r\
]");
}
System.out.println("[\\r\
]");
String responseStr =resourceName + "[" + description + "]";
return responseStr;
}
public static void main(String[] args) {
URI uri = UriBuilder.fromUri("http://127.0.0.1").port(10000).build();
ResourceConfig rc = new PackagesResourceConfig("com.sean");
try {
HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);
server.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
클 라 이언 트
Maven 설정 은 다음 과 같 습 니 다:
4.0.0
JERSEY_CLIENT
JERSEY_CLIENT
1.0
com.sun.jersey
jersey-client
1.18
com.sun.jersey
jersey-grizzly2
1.18
클 라 이언 트 프로그램 은 다음 과 같 습 니 다.
package com.sean;
import java.net.URI;
import java.util.Iterator;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriBuilder;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
public class JerseyClient {
public static void main(String[] args) {
// Jersey Client API, Client
// Client
//
ClientConfig cc = new DefaultClientConfig();
cc.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10*1000);
// Client ,
// web , ,
// Client WebResource
Client client = Client.create(cc);
//
// Client client = Client.create();
// client.setConnectTimeout(10*1000);
// client.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10*1000);
// WebResource Client timeout
WebResource resource = client.resource("http://127.0.0.1:10000/service/sean?desc=description");
String str = resource
.accept(MediaType.TEXT_PLAIN)
.type(MediaType.TEXT_PLAIN)
.get(String.class);
System.out.println("String:" + str);
URI uri = UriBuilder.fromUri("http://127.0.0.1/service/sean").port(10000)
.queryParam("desc", "description").build();
resource = client.resource(uri);
//header HTTP
ClientResponse response = resource.header("auth", "123456")
.accept(MediaType.TEXT_PLAIN)
.type(MediaType.TEXT_PLAIN)
.get(ClientResponse.class);
// HTTP
System.out.println("****** HTTP response ******");
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("HTTP/1.1 ");
strBuilder.append(response.getStatus() + " ");
strBuilder.append(response.getStatusInfo() + "[\\r\
]");
System.out.println(strBuilder.toString());
MultivaluedMap headers = response.getHeaders();
Iterator iterator = headers.keySet().iterator();
while(iterator.hasNext()){
String headName = iterator.next();
System.out.println(headName + ":" + headers.get(headName) + "[\\r\
]");
}
System.out.println("[\\r\
]");
System.out.println(response.getEntity(String.class) + "[\\r\
]");
}
}
서버 로 그 는 다음 과 같 습 니 다:
06, 2015 4:33:33 com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
com.sean
06, 2015 4:33:33 com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
class com.sean.Test
class com.sean.MyResource
06, 2015 4:33:33 com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
06, 2015 4:33:33 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18 11/22/2013 01:21 AM'
06, 2015 4:33:34 org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [127.0.0.1:10000]
06, 2015 4:33:34 org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
1814260800
****** HTTP request ******
GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r
]
accept:[text/plain][\r
]
content-type:[text/plain][\r
]
user-agent:[Java/1.7.0_65][\r
]
host:[127.0.0.1:10000][\r
]
connection:[keep-alive][\r
]
[\r
]
1814260800
****** HTTP request ******
GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r
]
auth:[123456][\r
]
accept:[text/plain][\r
]
content-type:[text/plain][\r
]
user-agent:[Java/1.7.0_65][\r
]
host:[127.0.0.1:10000][\r
]
connection:[keep-alive][\r
]
[\r
]
클 라 이언 트 로 그 는 다음 과 같 습 니 다.
String:sean[description]
****** HTTP response ******
HTTP/1.1 200 OK[\r
]
Transfer-Encoding:[chunked][\r
]
Date:[Fri, 06 Feb 2015 08:33:38 GMT][\r
]
Content-Type:[text/plain][\r
]
[\r
]
sean[description][\r
]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
귀멸의 칼날, 토호를 멸비정상적인 고부하에 대비하는 것은 쉽지 않은 것은 중대한 인식에 있습니다. 10/13(화) 00:00:00←예매권의 좌석 지정・신규 감상권 구입 접수 개시 나도 귀멸의 칼 팬 중 한 명으로 예매권을 구입하고 좌석 지...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.