一、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;}
}

  请求的结果如下:

转载于:https://www.cnblogs.com/always-online/p/4231531.html

cxf开发Restful Web Services相关推荐

  1. cxf restful_使用Apache CXF开发RESTful服务

    cxf restful 介绍 如您所知,有两种开发Web服务的方法 简单对象访问协议(SOAP) 代表性状态转移(REST) 在继续学习如何使用Apache CXF创建基于REST的Web服务之前,我 ...

  2. 使用Apache CXF开发RESTful服务

    介绍 如您所知,有两种开发Web服务的方法 简单对象访问协议(SOAP) 代表性状态转移(REST) 在继续学习如何使用Apache CXF创建基于REST的Web服务之前,我们将了解什么是REST. ...

  3. RESTful Web Services初探

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

  4. JAX-RS(Java API for RESTful Web Services)常用注解

    为什么80%的码农都做不了架构师?>>>    概述 JAX-RS(Java API for RESTful Web Services)是Java 提供用于开发RESTful Web ...

  5. 使用Hibernate-Validator优雅的验证RESTful Web Services的参数

    何为Hibernate-Validator 在RESTful Web Services的接口服务中,会有各种各样的入参,我们不可能完全不做任何校验就直接进入到业务处理的环节,通常我们会有一个基础的数据 ...

  6. cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务

    cxf 服务端soap报文 在上一篇文章中,我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤. 在本文中,我将讨论使用CXF开发SOAP Web服务. 在继续前进之前,让我们先 ...

  7. 使用Apache CXF开发SOAP Web服务

    在上一篇文章中,我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤. 在本文中,我将讨论使用CXF开发SOAP Web服务. 在继续前进之前,让我们了解构成SOAP Web服务的 ...

  8. Jboss RestEasy构建简单的RESTful Web Services示例(1)

    2019独角兽企业重金招聘Python工程师标准>>> 项目上要用到webservice,鉴于现在restful webservice比较流行,打算用restful来建立webser ...

  9. 用cxf开发restful风格的WebService

    我们都知道cxf还可以开发restful风格的webService,下面是利用maven+spring4+cxf搭建webService服务端和客户端Demo 1.pom.xml <projec ...

最新文章

  1. faceboxes自定义encode
  2. js源码 模仿 jquery的ajax的获取数据(get,post )的请求封装
  3. c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...
  4. Linux的capability深入分析(2)
  5. rabbitmq原理总结,Java反射的简单入门
  6. 开源框架_Index
  7. netty框架实现websocket达到高并发
  8. 关于VS2008SP1无法安装相信你的VS08是中文版,英文版不存在该问题。
  9. 中级微观经济学:Chap 35 外部效应
  10. 光子晶体的应用背景和研究历史
  11. Stanford University CS144 Lab2 The TCP Receiver
  12. Cibersort 算法 分析肿瘤样本免疫细胞组分
  13. 学计算机推荐的平板电脑,适合学生的平板电脑_学生平板推荐2020
  14. torch.utils.data.WeightedRandomSampler样本不均衡情况下带权重随机采样
  15. 京东零售数据仓库演进之路
  16. 基于MATLAB的波束成型仿真
  17. 【杂货铺】中国房屋种类
  18. 电子商务基础:中小企业建站方案和资源
  19. 2022年京东NLP实习面试题7道
  20. 春运火车票开售 多地火车站启用刷脸通关

热门文章

  1. Hive常用的SQL命令操作
  2. jq执行2次同样的方法怎么让第一次执行的不触发_他们说,这段代码你能看得懂她的开始,却猜不中她的结尾。...
  3. python调用ping命令_我可以创建一个脚本来测试是否可以在python服务器上远程使用SSH和PING命令吗? - python...
  4. python全栈面试题_全栈工程师对Python面试中is和==区别的详细解说!看完真的学到了!...
  5. Docker网络配置进阶
  6. C语言经典例20-小球反弹高度问题
  7. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积起点定理 | 左边序列概念 | 推理 )
  8. 【C 语言】多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )
  9. Codeforces 1103
  10. 完全搞懂傅里叶变换和小波(3)——泰勒公式及其证明