1. 程式人生 > >WebService學習-04(JAX-RS)

WebService學習-04(JAX-RS)

1. JAX-RS = Java API For Restful Web Services

JAX-RS是JAVA EE6 引入的一個新規範。 是一個Java 程式語言的應用程式介面,支援按照表述性狀態轉移(REST)架構風格建立Web
服務。

JAX-RS使用了Java標註來簡化Web服務的客戶端和服務端的開發和部署。

除了JAX-RS方式釋出Restful風格的Webservice
SpringMVC也可以釋出Restful風格的Webservice 
JAX-RS提供了一些標註將一個資源類,一個POJO Java類,封裝為Web資源。
包括:

@Path,標註資源類或者方法的相對路徑
@GET,@PUT,@POST,@DELETE,標註方法是HTTP請求的型別。
@Produces,標註返回的MIME媒體型別
@Consumes,標註可接受請求的MIME媒體型別
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分別標註方法的引數來
自於HTTP請求的不同位置,例如:
	@PathParam來自於URL的路徑,
	@QueryParam來自於URL的查詢引數,
	@HeaderParam來自於HTTP請求的頭資訊,
	@CookieParam來自於HTTP請求的Cookie。

基於JAX-RS實現的框架有Jersey,RESTEasy等。
這兩個框架建立的應用可以很方便地部署到Servlet 容器中
怎麼用:
1 建工程添jar包(Cxf的jar包)

2 建Customer.java的entity並添加註解@XmlRootElement

3 建CustomerService介面並新增Restful風格相關的註釋

4 編寫CustomerServiceImpl實現類

5 編寫MainServer類,啟動Restful的Webservice
	啟動後注意目前用rest而不是soap了,所以沒有WSDL的描述了

6 瀏覽器位址列裡面按照Restful風格的路徑進行訪問+測試

Entity類:

@XmlRootElement
public class Customer {

public Customer (){
}
private String id ;

private String name;

private Integer age;

public Customer(String id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}

Service類:

@Path("/crm")
public class CustomerService   {

@GET
@Path("/customer/{id}")
@Produces("application/json")
public Customer getCustomerById(@PathParam("id") String id){
   System.out.println("get id:"+id);
   Customer res_customer=new Customer(id,"z3",18);
   return res_customer;
  }
}

服務啟動類:

public class MainServer {
  public static void main(String[] args) {
    JAXRSServerFactoryBean jAXRSServerFactoryBean = new JAXRSServerFactoryBean();
 
    jAXRSServerFactoryBean.setAddress("http://localhost:8888/restws");

    jAXRSServerFactoryBean.setResourceClasses(CustomerServiceImpl.class);

    jAXRSServerFactoryBean.create().start();
    }
}

客戶端開發步驟:

使用 HttpClient需要以下6個步驟:

1. 建立 HttpClient 的例項

2. 建立某種連線方法的例項

3. 呼叫第一步中建立好的例項的execute方法來執行第二步中建立好的連結類例項

4. 讀response獲取HttpEntity

5. 對得到後的內容進行處理

6. 釋放連線。無論執行方法是否成功,都必須釋放連線

客戶端類:

private static String getCustomer(String id) throws ClientProtocolException, IOException{

    CloseableHttpClient httpclient = HttpClientBuilder.create().build();
    HttpGet httpget = new HttpGet("http://localhost:8888/restws/crm/customer/1122");
 
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();
    if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
    String result = EntityUtils.toString(entity, "UTF-8");
    System.out.println(result);
    }else{
        String result = EntityUtils.toString(entity, "UTF-8");
        System.err.println(result);

    }
    EntityUtils.consume(entity);
    httpclient.close();
}