rest service java_java实现REST方式的webService

一. 简介

WebService有两种方式,一是SOAP方式,二是REST方式。SOAP是基于XML的交互,WSDL也是一个XML文档,可以使用WSDL作为SOAP的描述文件;REST是基于HTTP协议的交互,支持JSON、XML等交互,不需要WSDL。

二. jar包介绍

1. 点击此下载 apache-cxf-3.0.3,并在 lib 文件夹下得到:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

commons-codec-1.9.jar

cxf-core-3.0.3.jar

cxf-rt-frontend-jaxrs-3.0.3.jar

cxf-rt-transports-http-3.0.3.jar

javax.ws.rs-api-2.0.1.jar

View Code

2. commons-httpclient-3.1.jar

三. 相关程序代码

1. applicationInterface.xml:spring配置文件

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd

http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

View Code

2. web.xml:web工程配置文件

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.4">

contextConfigLocation

classpath:applicationInterface.xml

CXFServlet

org.apache.cxf.transport.servlet.CXFServlet

CXFServlet

/service/*

View Code

3. 基础服务

a. BaseService.java:接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.ims.interfaces.webService.cxf;importjavax.ws.rs.Consumes;importjavax.ws.rs.POST;importjavax.ws.rs.Produces;importjavax.ws.rs.QueryParam;importjavax.ws.rs.core.MediaType;public interfaceBaseService {

@POST

@Consumes(MediaType.TEXT_HTML)

@Produces(MediaType.TEXT_HTML)public void execute(@QueryParam("type") String type);

}

View Code

b. BaseServiceImpl.java:实现

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.ims.interfaces.webService.cxf;importjava.io.BufferedInputStream;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.ws.rs.Consumes;importjavax.ws.rs.POST;importjavax.ws.rs.Produces;importjavax.ws.rs.QueryParam;importjavax.ws.rs.core.Context;importjavax.ws.rs.core.MediaType;/*** 基础服务接口*/

public abstract class BaseServiceImpl implementsBaseService{

@ContextprotectedHttpServletRequest request;

@ContextprotectedHttpServletResponse response;

@Override

@POST

@Consumes(MediaType.TEXT_HTML)

@Produces(MediaType.TEXT_HTML)public void execute(@QueryParam("type") String type) {try{//获取请求类型

RequestType reqType =RequestType.getTypeByCode(Integer.valueOf(type));//获取HTTP请求体XML字符输入流

BufferedReader reader = newBufferedReader(newInputStreamReader(new BufferedInputStream(request.getInputStream()), "gb2312"));//业务处理

ResponseResult result =process(reqType, reader);//设置响应编码

response.setStatus(result.getStatus().getCode());//输出响应体

response.setCharacterEncoding("gb2312");

OutputStream outputStream=response.getOutputStream();

outputStream.write(result.getResult().getBytes("gb2312"));

}catch(IOException ioe) {

response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

}

}public abstractResponseResult process(RequestType reqType, BufferedReader reader);

}

View Code

4. Receiver.java:接收端类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.ims.test.webService.cxf;importjava.io.BufferedReader;importjavax.ws.rs.Path;importcom.ims.interfaces.webService.cxf.BaseServiceImpl;importcom.ims.interfaces.webService.cxf.RequestType;importcom.ims.interfaces.webService.cxf.ResponseResult;importcom.ims.interfaces.webService.cxf.ResponseStatus;

@Path(value= "/receive.do")public class Receiver extendsBaseServiceImpl {

@OverridepublicResponseResult process(RequestType reqType, BufferedReader reader) {

ResponseResult result= null;switch(reqType){caseUNKNOWN:

result= new ResponseResult(ResponseStatus.CODE400, "");break;default:break;

}returnresult;

}

}

View Code

5. Sender.java:发送端类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.ims.test.webService.cxf;importorg.apache.commons.httpclient.HttpClient;importorg.apache.commons.httpclient.HttpStatus;importorg.apache.commons.httpclient.methods.PostMethod;importorg.apache.commons.httpclient.methods.StringRequestEntity;public classSender {public static voidmain(String[] args) {

String url= "http://localhost:8090/ims/service/receive.do?type=0";

String xmlString= "<?xml version=\"1.0\" encoding=\"gbk\"?>";

post(url, xmlString);

}/*** 发送xml数据请求到server端

*@paramurl xml请求数据地址

*@paramxmlString 发送的xml数据流

*@returnnull发送失败,否则返回响应内容*/

public static booleanpost(String url,String xmlString){boolean result = false;//创建httpclient工具对象

HttpClient client = newHttpClient();//创建post请求方法

PostMethod myPost = newPostMethod(url);//设置请求超时时间

client.getHttpConnectionManager().getParams().setConnectionTimeout(300*1000);try{//设置请求头部类型

myPost.setRequestHeader("Content-Type","text/html");

myPost.setRequestEntity(new StringRequestEntity(xmlString,"text/html","gbk"));int statusCode =client.executeMethod(myPost);if(statusCode ==HttpStatus.SC_OK){

result= true;

}

}catch(Exception e) {

e.printStackTrace();

}finally{

myPost.releaseConnection();

}returnresult;

}

}

View Code

四. 测试

eclipse上启动ims工程(webService接收端),以java执行Sender类,eclipse上调试查看Receive类是否收到xml文件

五. 备注

1. cxf 是支持多线程的,默认的线程池配置可查看 org.apache.cxf.workqueue.AutomaticWorkQueueImpl 源文件:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

static final int DEFAULT_MAX_QUEUE_SIZE = 256;

。。。。。。。。。publicAutomaticWorkQueueImpl() {this(DEFAULT_MAX_QUEUE_SIZE);

}publicAutomaticWorkQueueImpl(String name) {this(DEFAULT_MAX_QUEUE_SIZE, name);

}public AutomaticWorkQueueImpl(intmax) {this(max, "default");

}public AutomaticWorkQueueImpl(intmax, String name) {this(max,0,25,5,2 * 60 * 1000L,

name);

}public AutomaticWorkQueueImpl(intmqs,intinitialThreads,inthighWaterMark,intlowWaterMark,longdequeueTimeout) {this(mqs, initialThreads, highWaterMark, lowWaterMark, dequeueTimeout, "default");

}public AutomaticWorkQueueImpl(intmqs,intinitialThreads,inthighWaterMark,intlowWaterMark,longdequeueTimeout,

String name) {this.maxQueueSize = mqs == -1 ?DEFAULT_MAX_QUEUE_SIZE : mqs;this.initialThreads =initialThreads;this.highWaterMark = -1 == highWaterMark ?Integer.MAX_VALUE : highWaterMark;this.lowWaterMark = -1 == lowWaterMark ?Integer.MAX_VALUE : lowWaterMark;this.dequeueTimeout =dequeueTimeout;this.name =name;this.changeListenerList = new ArrayList();

}

。。。。。。。。。protected synchronizedThreadPoolExecutor getExecutor() {if (executor == null) {

threadFactory=createThreadFactory(name);

executor= newThreadPoolExecutor(lowWaterMark,

highWaterMark,

TimeUnit.MILLISECONDS.toMillis(dequeueTimeout),

TimeUnit.MILLISECONDS,new LinkedBlockingQueue(maxQueueSize),

threadFactory) {

@Overrideprotected voidterminated() {

ThreadFactory f=executor.getThreadFactory();if (f instanceofAWQThreadFactory) {

((AWQThreadFactory)f).shutdown();

}if (watchDog != null) {

watchDog.shutdown();

}

}

};

View Code

2. 若要配置线程池参数,可配置 cxf-core-3.0.3.jar\META-INF\cxf\cxf.xml 文件:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

20000

default

View Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值