一、restful web services

  rest全称是Representation State Transfer(表述性状态转移)。它是一种软件架构风格,只是提供了一组设计原则和约束条件。在restful web services的设计原则中,所有的事物都应该拥有唯一的URI,通过对URI的请求访问,完成相应的操作。访问的方法与http协议中的若干方法相对应。如下:

  • 创建资源,使用 POST 方法。
  • 获取某个资源,使用 GET 方法。
  • 对资源进行更新,使用 PUT 方法。
  • 删除某个资源,使用 DELETE 方法。

二、使用cxf进行构建

  1、服务器端

  新建工程,添加cxf的依赖jar包。添加netty-all依赖,这里使用到的是netty-all-4.0.25.Final,下载地址为:http://netty.io/downloads.html 。

  实体类Address:

package com.cxf.jaxrs;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "address")
public class Address { private int id;
private String city;
private String street; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} public String getStreet() {
return street;
} public void setStreet(String street) {
this.street = street;
} }

  实体类Person:

package com.cxf.jaxrs;

import java.util.Date;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person")
public class Person { private int id;
private String name;
private Date date; private Address address; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} public Address getAddress() {
return address;
} public void setAddress(Address address) {
this.address = address;
} }

  服务接口MyService:

package com.cxf.jaxrs;

import java.util.Date;
import java.util.List; import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; @Path("/person/")
// @Produces("text/xml") //只返回xml类型
// @Produces("application/json") //只返回json类型
@Produces("*/*") //表示可返回所有类型
public class MyService { @GET //get方法请求
@Path("/{id}/") //路径
public Person getById(@PathParam("id") int id) {
Person person = new Person();
person.setId(id);
person.setName("zhangsan");
person.setDate(new Date()); Address add = new Address();
add.setId(22);
add.setCity("shanghai");
add.setStreet("pudong");
person.setAddress(add); return person;
} @GET //get方法请求
@Path("/") //路径
public List<Person> getAll() {
List<Person> persons = new java.util.ArrayList<Person>();
Person person = new Person();
person.setId(111);
person.setName("zhangsan");
person.setDate(new Date()); Person person2 = new Person();
person2.setId(222);
person2.setName("lisi");
person2.setDate(new Date());
persons.add(person);
persons.add(person2);
return persons;
} @DELETE //delete方法请求
@Path("/{id}") //路径
public Person removeById(@PathParam("id") int id) {
Person person = new Person();
person.setId(111);
person.setName("zhangsan");
person.setDate(new Date());
return person;
} @POST //post方法请求
@Path("/") //路径
public Person add(Person person) {
System.out.println(person.getDate());
return person;
} @PUT //put方法请求
@Path("/{id}/") //路径
public Person update(@PathParam("id") int id, Person person) {
System.out.println("put id : " + id);
System.out.println(person.getDate());
return person;
}
}

  对于服务类,我们也可定义一个接口,在接口里面写annotation,再定义一个实现类,实现类之完成具体业务逻辑。这样也是可以的。

  服务器启动类Server:

package com.cxf.jaxrs;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider; public class Server {
public static void main(String[] args) { JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
factoryBean.setAddress("http://localhost:9000/myservice"); factoryBean.setResourceClasses(MyService.class);
factoryBean.setResourceProvider(MyService.class,
new SingletonResourceProvider(new MyService()));
factoryBean.getInInterceptors().add(new LoggingInInterceptor());
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
factoryBean.create();
}
}

  2、客户端

  对于客户端访问,使用apache的httpclient进行请求。cxf的lib目录总已经有httpclient jar包,这里可以直接使用。

  访问代码如下:

package com.cxf.jaxrs;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element; public class Client { public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); public static void main(String[] args) throws Exception { System.out.println("===========================get by url =================================");
String getResult = get("http://localhost:9000/myservice/person/1");
System.out.println(getResult); System.out.println("===========================get===================================");
String getsResult = get("http://localhost:9000/myservice/person");
System.out.println(getsResult); System.out.println("===========================delete===================================");
String deleteResult = delete("http://localhost:9000/myservice/person/1");
System.out.println(deleteResult); System.out.println("===========================post=================================");
Person person = new Person();
person.setId(3435);
person.setName("lisi");
person.setDate(new Date()); Document document = coverPersonToDocument(person); String data = coverDocumentToString(document); System.out.println("request data: ");
System.out.println(data); String postResult = post("http://localhost:9000/myservice/person", data);
System.out.println("response data: ");
System.out.println(postResult); System.out.println("===========================put===================================");
Person person2 = new Person();
person2.setId(3435);
person2.setName("lisi");
person2.setDate(new Date()); document = coverPersonToDocument(person); data = coverDocumentToString(document); System.out.println("request data: "); String putResult = put("http://localhost:9000/myservice/person/1", data);
System.out.println("response data: ");
System.out.println(putResult); } /**
* 发送get 方法请求,并返回结果
* @param url
* @return
* @throws IOException
* @throws ParserConfigurationException
*/
private static String get(String url) throws IOException,
ParserConfigurationException {
HttpGet get = new HttpGet(url);
get.setHeader("Accept", "application/json");//接受json数据返回类型
CloseableHttpClient client = HttpClients.createDefault();
String responseContent = null;
CloseableHttpResponse response = null;
try {
response = client.execute(get);
HttpEntity entity = response.getEntity();//响应体
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//响应状态码
responseContent = EntityUtils.toString(entity, "UTF-8");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} return responseContent;
} /**
* 发送delete 方法请求,并返回结果
* @param url
* @return
* @throws IOException
* @throws ParserConfigurationException
*/
private static String delete(String url) throws IOException,
ParserConfigurationException {
HttpDelete delete = new HttpDelete(url);
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse response = null;
String responseContent = null;
try {
response = client.execute(delete);
HttpEntity entity = response.getEntity();//响应体
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//响应状态码
responseContent = EntityUtils.toString(entity, "UTF-8");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
}
return responseContent;
} /**
* 发送post 方法请求,并返回结果
* @param url
* @param data
* @return
* @throws IOException
* @throws ParserConfigurationException
*/
private static String post(String url, String data) throws IOException,
ParserConfigurationException {
HttpPost post = new HttpPost(url); StringEntity myEntity = new StringEntity(data,
ContentType.APPLICATION_XML);//请求体数据,xml类型
post.setEntity(myEntity); CloseableHttpClient client = HttpClients.createDefault();
String responseContent = null;
CloseableHttpResponse response = null;
try {
response = client.execute(post);
HttpEntity entity = response.getEntity();//响应体
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//响应状态码
responseContent = EntityUtils.toString(entity, "UTF-8");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
}
return responseContent;
} /**
* 发送put 方法请求,并返回结果
* @param url
* @param data
* @return
* @throws ParserConfigurationException
* @throws IOException
*/
private static String put(String url, String data)
throws ParserConfigurationException, IOException {
HttpPut put = new HttpPut(url);
StringEntity myEntity = new StringEntity(data,
ContentType.APPLICATION_XML);
put.setEntity(myEntity);
put.setHeader("Accept", "application/json");//接受json数据返回类型
CloseableHttpClient client = HttpClients.createDefault();
String responseContent = null;
CloseableHttpResponse response = null;
try {
response = client.execute(put);
HttpEntity entity = response.getEntity();//响应体
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//响应状态码
responseContent = EntityUtils.toString(entity, "UTF-8");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
}
return responseContent;
} /**
* 使用对象构造xml文档对象,并返回
* @param person
* @return
* @throws ParserConfigurationException
*/
private static Document coverPersonToDocument(Person person)
throws ParserConfigurationException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element root = document.createElement("person");
Element node = document.createElement("id");
node.setTextContent(String.valueOf(person.getId())); Element node2 = document.createElement("name");
node2.setTextContent(person.getName()); Element node3 = document.createElement("date");
node3.setTextContent(format.format(person.getDate())); root.appendChild(node);
root.appendChild(node2);
root.appendChild(node3); document.appendChild(root);
return document;
} /**
* 将xml文档对象转换成String,并返回
* @param document
* @return
* @throws TransformerFactoryConfigurationError
*/
private static String coverDocumentToString(Document document)
throws TransformerFactoryConfigurationError {
StreamResult strResult = new StreamResult(new StringWriter());
TransformerFactory tfac = TransformerFactory.newInstance();
try {
javax.xml.transform.Transformer t = tfac.newTransformer();
t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty(OutputKeys.METHOD, "xml"); // xml, html,
t.transform(new DOMSource(document.getDocumentElement()), strResult);
} catch (Exception e) {
System.err.println("XML.toString(Document): " + e);
}
String data = strResult.getWriter().toString();
return data;
}
}

  请求的结果如下:

cxf开发Restful Web Services的更多相关文章

  1. 使用 Spring 3 来创建 RESTful Web Services

    来源于:https://www.ibm.com/developerworks/cn/web/wa-spring3webserv/ 在 Java™ 中,您可以使用以下几种方法来创建 RESTful We ...

  2. 使用 Spring 3 来创建 RESTful Web Services(转)

    使用 Spring 3 来创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参 ...

  3. Spring 3 来创建 RESTful Web Services

    Spring 3 创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参考实现 ...

  4. Spring 4 集成Apache CXF开发JAX-RS Web Service

    什么是JAX-RS 在JSR-311规范中定义,即Java API for RESTful Web Services,一套Java API,用于开发 RESTful风格的Webservice. 工程概 ...

  5. 使用CXF开发RESTFul服务

    相信大家在阅读CXF官方文档(http://cxf.apache.org/docs/index.html)时,总是一知半解.这里向大家推荐一本PacktPub.Apache.CXF.Web.Servi ...

  6. 用Jersey为Android客户端开发Restful Web Service

    平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关 ...

  7. RESTful Web Services初探

    RESTful Web Services初探 作者:杜刚 近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTf ...

  8. RESTful Web Services测试工具推荐

    命令行控的最爱:cURL cURL是一个很强大的支持各种协议的文件传输工具,用它来进行RESTful Web Services的测试简直是小菜一碟.这个工具基本上类Unix操作系统(各种Linux.M ...

  9. 【转】RESTful Web Services初探

    近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTful风格的Web Services,比较著名的包括Twit ...

随机推荐

  1. Activating Browser Modes with Doctype

    原文地址:https://hsivonen.fi/doctype/ In order to deal both with content written according to Web standa ...

  2. IOS开发UI基础UIPageControl的属性

    UIPageControl 常见属性: •    numberOfPages // 设置有多少页 默认为0 [pageControl setNumberOfPages:kImageCount]; •  ...

  3. 关于Chrome Dev Tool

    ★注意点一:函数名,方法名要拼写准确;

  4. 有关CLR的初学小整理2(可能理解不深刻,望大牛指出)

    针对原文有用的段落,写一写自己的理解,注释: 1. 托管exe文件被启动的时候,首先被PE Loader载入.PE Loader载入exe文件之后,会分析PE文件头的data directory ta ...

  5. 母版页 VS shtml—ASP.NET细枝末节(3)

    这算是html的重用吧? 摘自: http://www.cnblogs.com/mcad/p/4352665.html 网页很多地方长得一样,也有不一样的地方. 把网页中一样的地方,提取出来,形成一个 ...

  6. 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片

    [源码下载] 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片 作者:webabcd 介绍与众不同 windows pho ...

  7. mysql学习笔记 第八天

    where,group by,having重新详解 where的用法: where与in的配合使用,in(值1,值2,...)表示结果在值1,值2,...其中任何一个. 聚合函数和group by的用 ...

  8. 小白学Linux(二)--命令行基本操作

    安装完Ubuntu后,进入系统,呈现在眼前的是Ubuntu的界面,跟windows的差不太多.一般操作系统包含GUI和CLI.GUI就是我们现在看到的,也是windows常用的直接用拖拽,点击等操作对 ...

  9. NYOJ:题目860 又见01背包

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=860 方法一:不用滚动数组(方法二为用滚动数组,为方法一的简化) 动态规划分析:最少要拿总 ...

  10. 【使用 DOM】使用 DOM 元素

    1. 使用元素对象 HTMLElement对象提供了一组属性,可以用它们来读取和修改被代表的数据.下表介绍了这些属性. 下面代码展示了如何使用表中所列的一些基本属性. <!DOCTYPE htm ...