java实现REST方式的webService

野性酷女 2022-06-09 04:51 443阅读 0赞

此文章是基于

  搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

一. 简介

    WebService有两种方式,一是SOAP方式,二是REST方式。SOAP是基于XML的交互,WSDL也是一个XML文档,

  可以使用WSDL作为SOAP的描述文件;REST是基于HTTP协议的交互,支持JSON、XML等交互,不需要WSDL。

二. 准备工作

  1. 点击此下载相关文件,并把文件放到 ims 工程对应的文件夹下

三. jar包介绍

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

ExpandedBlockStart.gif

  1. commons-codec-1.9.jar
  2. cxf-core-3.0.3.jar
  3. cxf-rt-frontend-jaxrs-3.0.3.jar
  4. cxf-rt-transports-http-3.0.3.jar
  5. javax.ws.rs-api-2.0.1.jar

  2. commons-httpclient-3.1.jar

四. 相关程序代码

  1. applicationInterface.xml:spring配置文件

ExpandedBlockStart.gif

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:jaxrs="http://cxf.apache.org/jaxrs"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
  9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
  10. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
  11. http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
  12. <!-- cxf发布rest服务 -->
  13. <import resource="classpath:META-INF/cxf/cxf.xml"/>
  14. <!-- 这里是cxf2.x版本的配置,3.0没有了要去掉 -->
  15. <!-- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> -->
  16. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
  17. <bean id="receiver" class="com.ims.test.webService.cxf.Receiver" />
  18. <jaxrs:server id="serviceContainer" address="/">
  19. <jaxrs:serviceBeans>
  20. <ref bean="receiver" />
  21. </jaxrs:serviceBeans>
  22. </jaxrs:server>
  23. <!-- cxf发布rest服务 -->
  24. </beans>

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

ExpandedBlockStart.gif

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd
  4. http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. version="2.4">
  6. <context-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>
  9. classpath:applicationInterface.xml
  10. </param-value>
  11. </context-param>
  12. <servlet>
  13. <servlet-name>CXFServlet</servlet-name>
  14. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>CXFServlet</servlet-name>
  18. <url-pattern>/service/*</url-pattern>
  19. </servlet-mapping>
  20. </web-app>

  3. 基础服务

    a. BaseService.java:接口

ExpandedBlockStart.gif

  1. package com.ims.interfaces.webService.cxf;
  2. import javax.ws.rs.Consumes;
  3. import javax.ws.rs.POST;
  4. import javax.ws.rs.Produces;
  5. import javax.ws.rs.QueryParam;
  6. import javax.ws.rs.core.MediaType;
  7. public interface BaseService {
  8. @POST
  9. @Consumes(MediaType.TEXT_HTML)
  10. @Produces(MediaType.TEXT_HTML)
  11. public void execute(@QueryParam("type") String type);
  12. }

    b. BaseServiceImpl.java:实现

ExpandedBlockStart.gif

  1. package com.ims.interfaces.webService.cxf;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.ws.rs.Consumes;
  10. import javax.ws.rs.POST;
  11. import javax.ws.rs.Produces;
  12. import javax.ws.rs.QueryParam;
  13. import javax.ws.rs.core.Context;
  14. import javax.ws.rs.core.MediaType;
  15. /**
  16. * 基础服务接口
  17. */
  18. public abstract class BaseServiceImpl implements BaseService{
  19. @Context
  20. protected HttpServletRequest request;
  21. @Context
  22. protected HttpServletResponse response;
  23. @Override
  24. @POST
  25. @Consumes(MediaType.TEXT_HTML)
  26. @Produces(MediaType.TEXT_HTML)
  27. public void execute(@QueryParam("type") String type) {
  28. try {
  29. // 获取请求类型
  30. RequestType reqType = RequestType.getTypeByCode(Integer.valueOf(type));
  31. // 获取HTTP请求体XML字符输入流
  32. BufferedReader reader = new BufferedReader(
  33. new InputStreamReader(
  34. new BufferedInputStream(request.getInputStream()), "gb2312"));
  35. // 业务处理
  36. ResponseResult result = process(reqType, reader);
  37. // 设置响应编码
  38. response.setStatus(result.getStatus().getCode());
  39. // 输出响应体
  40. response.setCharacterEncoding("gb2312");
  41. OutputStream outputStream = response.getOutputStream();
  42. outputStream.write(result.getResult().getBytes("gb2312"));
  43. }
  44. catch (IOException ioe) {
  45. response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  46. }
  47. }
  48. public abstract ResponseResult process(RequestType reqType, BufferedReader reader);
  49. }

  4. Receiver.java:接收端类

ExpandedBlockStart.gif

  1. package com.ims.test.webService.cxf;
  2. import java.io.BufferedReader;
  3. import javax.ws.rs.Path;
  4. import com.ims.interfaces.webService.cxf.BaseServiceImpl;
  5. import com.ims.interfaces.webService.cxf.RequestType;
  6. import com.ims.interfaces.webService.cxf.ResponseResult;
  7. import com.ims.interfaces.webService.cxf.ResponseStatus;
  8. @Path(value = "/receive.do")
  9. public class Receiver extends BaseServiceImpl {
  10. @Override
  11. public ResponseResult process(RequestType reqType, BufferedReader reader) {
  12. ResponseResult result = null;
  13. switch(reqType){
  14. case UNKNOWN:
  15. result = new ResponseResult(ResponseStatus.CODE400, "");
  16. break;
  17. default:
  18. break;
  19. }
  20. return result;
  21. }
  22. }

  5. Sender.java:发送端类

ExpandedBlockStart.gif

  1. package com.ims.test.webService.cxf;
  2. import org.apache.commons.httpclient.HttpClient;
  3. import org.apache.commons.httpclient.HttpStatus;
  4. import org.apache.commons.httpclient.methods.PostMethod;
  5. import org.apache.commons.httpclient.methods.StringRequestEntity;
  6. public class Sender {
  7. public static void main(String[] args) {
  8. String url = "http://localhost:8090/ims/service/receive.do?type=0";
  9. String xmlString = "<?xml version=\"1.0\" encoding=\"gbk\"?>";
  10. post(url, xmlString);
  11. }
  12. /**
  13. * 发送xml数据请求到server端
  14. * @param url xml请求数据地址
  15. * @param xmlString 发送的xml数据流
  16. * @return null发送失败,否则返回响应内容
  17. */
  18. public static boolean post(String url,String xmlString){
  19. boolean result = false;
  20. //创建httpclient工具对象
  21. HttpClient client = new HttpClient();
  22. //创建post请求方法
  23. PostMethod myPost = new PostMethod(url);
  24. //设置请求超时时间
  25. client.getHttpConnectionManager().getParams().setConnectionTimeout(300*1000);
  26. try{
  27. //设置请求头部类型
  28. myPost.setRequestHeader("Content-Type","text/html");
  29. myPost.setRequestEntity(new StringRequestEntity(xmlString,"text/html","gbk"));
  30. int statusCode = client.executeMethod(myPost);
  31. if(statusCode == HttpStatus.SC_OK){
  32. result = true;
  33. }
  34. }catch (Exception e) {
  35. e.printStackTrace();
  36. }finally{
  37. myPost.releaseConnection();
  38. }
  39. return result;
  40. }
  41. }

四. 测试

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

发表评论

表情:
评论列表 (有 0 条评论,443人围观)

还没有评论,来说两句吧...

相关阅读