一、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. BZOJ1087状压DP 解题报告

    1087: [SCOI2005]互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的 ...

  2. [Solution] Microsoft Windows 服务(3) 使用Quartz.net定时任务

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,Quartz.net 就是Quartz的移植版本.Quartz可以用来创建简单或为运行十个,百个,甚至是 ...

  3. SQLServer获取临时表所有列名或是否存在指定列名的方法

    获取临时表中所有列名 select name from tempdb.dbo.syscolumns where id=object_id( '#TempTB') 判断临时表中是否存在指定列名 if c ...

  4. C#代码反编译 得到项目可运行源码

    C#代码反编译 得到项目可运行源码 摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html 谈到"C#代码反编译&quo ...

  5. 如何在ASP.Net中实现RSA加密

    在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...

  6. .net reflector激活

    1.断网 2. 运行.NET Reflector,点击Help -> Activate 3. 运行注册机,复制注册机生成的序列号,粘贴到.NET Reflector中的激活输入框 4. 点击激活 ...

  7. easyui-简单用法寄一些属性

    Easyui 总结 优点: A.简单易用 继承 jQuery 简易使用特性,提供高度抽象接口,短期改善网站易用性. B.开源免费 采用 MIT & GPL 双协议授权,轻松满足自由产品至企业产 ...

  8. 【原创】C#通用权限管理-程序安全检查,这些你一定要考虑到位

    接触通用权限已经一年,现在使用已经很熟练,分享通用权限管理下面的一些好的开发思想. 安全漏洞对于一个小项目来说,可能不是特别的重视,对于一个大项目来说,这是特别重要需要注意的,特别是在项目开发中的就要 ...

  9. .net多线程的发展

    APM和EAP是在async/await之前的两种不同的异步编程模式. APM如果不阻塞主线程,那么完成通知(回调)就会执行在另外一个线程中,从而给我们更新UI带来一定的问题. EAP的通知事件是在主 ...

  10. jquery fadeOut 异步

    1. 概述 jquery实现动画效果的函数使用起来很方便,不过动画执行是异步的, 所以要把自定义的操作放在回调函数里. 2. example <html> <body> < ...