Jersey 프레임 워 크 1: Jersey RESTful WebService 프레임 워 크 소개

Jersey 시리즈 글:
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
]

좋은 웹페이지 즐겨찾기