tomcat发布基于jersey的WebService

周末继续学习jersey,测试了几个get和post方式的webservice请求,并模拟客户端测试调用情况。在google中找到了这么一篇相关的文章:

REST: CRUD with JAX-RS (Jersey) 。   结果做到一半出了问题,服务端总是获取不到客户端请求的数据流内容!调试了一个下午未果,却在第二天如梦方醒般的找到了原因。教训1:学习下http协议;教训2:老外的东西不一定是对的。

 

周末的测试主要还是基于jersey的webservice服务。对get和post两种方式发送请求的几种情况都做了简单的示例(上传文件的情况未测试,待续)。

 

service端:

[java]  view plain copy
  1. @Path("/hello")  
  2. public class HelloService {  
  3.     @GET  
  4.     @Produces("text/plain")  
  5.     public String helloWorld(){  
  6.         return "hello world";  
  7.     }  
  8.     /* 
  9.      * post param  test 
  10.      */  
  11.     @POST     
  12.     @Path("echo")  
  13.     @Consumes("application/x-www-form-urlencoded")    
  14.     public String echo(@FormParam("msg") String msg){  
  15.         return "are you say "+msg;  
  16.     }  
  17.     /* 
  18.      * get param test 
  19.      */  
  20.     @GET  
  21.     @Path("sex")  
  22.     @Produces("text/plain")  
  23.     public String getSex(@PathParam("name") String name){  
  24.         return "male";  
  25.     }  
  26.       
  27.     /* 
  28.      * get {} request  
  29.      * http://houfeng:8080/jerseyWebServiceTest/services/hello/age/houfeng 
  30.      */  
  31.     @GET  
  32.     @Path("age/{name}")  
  33.     @Produces("text/plain")  
  34.     public String getAge(@PathParam("name") String name){  
  35.         return "18";  
  36.     }  
  37.       
  38.       
  39.     /* 
  40.      * get {} request 
  41.      * http://houfeng:8080/jerseyWebServiceTest/services/hello/223232323 
  42.      */  
  43.     @GET  
  44.     @Path ("{id}")  
  45.     @Produces ("application/xml")  
  46.     public StreamingOutput retrieveCustomer(@PathParam ("id") String customerId) {  
  47.         String customerDetails = "hou,feng,232";   
  48.         final String[] details = customerDetails.split(",");   
  49.         return new StreamingOutput() {    
  50.             public void write(OutputStream outputStream) {    
  51.                 PrintWriter out = new PrintWriter(outputStream);  
  52.                 out.println("<?xml version=/"1.0/" encoding=/"UTF-8/"?>");  
  53.                 out.println("<customer>");  
  54.                 out.println("<firstname>" + details[0] + "</firstname>");  
  55.                 out.println("<lastname>" + details[1] + "</lastname>");  
  56.                 out.println("<zipcode>" + details[2] + "</zipcode>");  
  57.                 out.println("</customer>");  
  58.                 out.close();  
  59.             }   
  60.         };   
  61.     }  
  62.       
  63.       
  64.     // get  vs  post   
  65.       
  66.     @GET  
  67.     @Path("test_get")  
  68.     @Produces("text/plain")  
  69.     public String getTest1(@PathParam("name") String name, @Context HttpServletRequest request){  
  70.         System.out.println("name:"+name);// null  
  71.         String result;  
  72.         result = request.getParameter("name");  
  73.         System.out.println("name="+result); //houfeng  
  74.         result+= "--------"+request.getContextPath();   
  75.         return result;  
  76.     }  
  77.       
  78.     /* 
  79.      * get 方式 正确的获取参数方法 @QueryParam 或者 用 request; url里有参数的用PathParam 
  80.      */  
  81.     @GET  
  82.     @Path("test_get2")  
  83.     @Produces("text/plain")  
  84.     public String getTest11(@QueryParam("name") String name, @Context HttpServletRequest request){  
  85.         System.out.println("name:"+name);// houfeng  
  86.         String result;  
  87.         result = request.getParameter("name");  
  88.         System.out.println("name="+result); //houfeng    
  89.         result+= "--------"+request.getContextPath();   
  90.         return result;  
  91.     }  
  92.    
  93.       
  94.     @POST  
  95.     @Path("test_post1")  
  96.     @Consumes("application/x-www-form-urlencoded")   
  97.     @Produces("text/plain")  
  98.     public String getTest2(@FormParam("name") String name){   
  99.         System.out.println(name);//houfeng  
  100.         String result=name;    
  101.         return result;  
  102.     }  
  103.       
  104.     @POST  
  105.     @Path("test_post2")  
  106.     @Consumes("application/x-www-form-urlencoded")   
  107.     @Produces("text/plain")  
  108.     public String getTest22(@QueryParam("name") String name){  
  109.         System.out.println("name:"+name);//houfeng,但是有警告。提示用FormParam  
  110.         String result = name;   
  111.         return result;  
  112.     }  
  113.       
  114.       
  115.     @POST  
  116.     @Path("test_post3")   
  117.     @Produces("text/plain")  
  118.     public String getTest2222(String entity, @Context HttpServletRequest request){  
  119.         System.out.println("entity:"+entity);//hello 传入方式:resource.entity("hello").post(String.class);  
  120.         String result;   
  121.         result= "--------"+request.getContextPath();   
  122.         return result;  
  123.     }  
  124.       
  125.     @POST  
  126.     @Path("test_post4")  
  127.     //@Consumes("application/xml"),这样就会出错;@Consumes("application/x-www-form-urlencoded") 可以。  
  128.     @Produces("text/plain")  
  129.     public String getTest22222(InputStream is, @Context HttpServletRequest request) throws Exception{  
  130.         byte[] buf = new byte[is.available()];  
  131.         is.read(buf);  
  132.         System.out.println("buf:"+new String(buf));  
  133.         String result;   
  134.         result= "--------"+request.getContextPath();   
  135.         return result;  
  136.     }  

 

客户端可以采用两种方式测试。

1,采用jersey实现的测试api:jersey-twitter-client-1.0-SNAPSHOT-jar-with-dependencies.jar 

2,采用apache httpclient 模拟客户端的各种请求。

上面提到的参考e文中是采用的第二种方式。在这里我使用jersey测试api来实现。

[java]  view plain copy
  1. public  void testHelloService() throws URISyntaxException {  
  2.     Client client = Client.create();  
  3.     URI u = new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello");  
  4.     System.out.println(u);  
  5.     WebResource resource = client.resource(u);  
  6.     //get  
  7.     String result = resource.get(String.class);  
  8.     System.out.println(result);  
  9.       
  10.     //get param  
  11.     u = new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/sex");  
  12.     System.out.println(u);  
  13.     resource = client.resource(u);  
  14.     MultivaluedMapImpl params = new MultivaluedMapImpl();  
  15.     params.add("name""houfeng");  
  16.     result = resource.queryParams(params).get(String.class);  
  17.     System.out.println(result);  
  18.       
  19.     u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_get");  
  20.     System.out.println(u);  
  21.     resource = client.resource(u);  
  22.     params = new MultivaluedMapImpl();  
  23.     params.add("name""houfeng");  
  24.     result = resource.queryParams(params).get(String.class);  
  25.     System.out.println(result);  
  26.       
  27.     u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_get2");  
  28.     System.out.println(u);  
  29.     resource = client.resource(u);  
  30.     params = new MultivaluedMapImpl();  
  31.     params.add("name""houfeng");  
  32.     result = resource.queryParams(params).get(String.class);  
  33.     System.out.println(result);  
  34.   
  35.       
  36.     u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post1");  
  37.     System.out.println(u);  
  38.     resource = client.resource(u);  
  39.     params = new MultivaluedMapImpl();  
  40.     params.add("name""houfeng");  
  41.     result = resource.type(MediaType.APPLICATION_FORM_URLENCODED).post(String.class,params);  
  42.     System.out.println(result);  
  43.       
  44.     u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post2");  
  45.     System.out.println(u);  
  46.     resource = client.resource(u);  
  47.     params = new MultivaluedMapImpl();  
  48.     params.add("name""houfeng");  
  49.     result = resource.queryParams(params).type(MediaType.APPLICATION_FORM_URLENCODED).post(String.class);  
  50.     System.out.println(result);  
  51.       
  52.     u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post3");  
  53.     System.out.println(u);  
  54.     resource = client.resource(u);   
  55.     result = resource.entity("hello").post(String.class);  
  56.     System.out.println(result);  
  57.       
  58.     u =new URI("http://houfeng:8080/jerseyWebServiceTest/services/hello/test_post4");  
  59.     System.out.println(u);  
  60.     resource = client.resource(u);   
  61.     String buf = "inputstream content.";  
  62.     ByteArrayInputStream bais = new ByteArrayInputStream(buf.getBytes());  
  63.     result = resource.entity(bais).post(String.class);  
  64.     System.out.println(result);  
  65. }  

 

过程中遇到的问题就是提交流的时候,错误的参考了e文中 “@Consumes ( "application/xml" ) ”的请求类型! 结果导致service 端 接受请求的方法参数InputStream 得不到内容。换作@Context HttpServeltRequest request 参数也无济于事。于是在网上搜索,在一个国外论坛中有人提到相似的问题“上传文件得不到流里的内容,但是jetty里可以,tomcat里不可以。?”。好像没有太大参考,但我也试了下,还是失败。。。

今天修改提交类型注解为:@Consumes("application/x-www-form-urlencoded") ,测试通过!终于才恍然大悟:application/xml是客户端接受的内容类型。哎,是应该学习下http协议的相关知识,这样的问题耽误了大半天的时间!

    另外,对于jax-ws中几个注解,简单总结下:
       QueryParam--url ? 后面表示的参数  .  get post 通用.
       PathParam---url中的一部分,例如用{}表示的url中的一部分。get post 通用。
       FormParam---post提交的form表单参数。     用于 post     

  ( 其他几个param稍后再学习)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写 Tomcat WebService 的代码可以分为以下几个步骤: 1. 定义 WebService 接口 首先需要定义 WebService 接口,该接口定义了 WebService 的方法和返回值。例如,定义一个计算器的接口: ```java @WebService public interface Calculator { @WebMethod int add(int a, int b); @WebMethod int subtract(int a, int b); } ``` 2. 实现 WebService 接口 接下来需要实现该接口,实现需要添加 `@WebService` 和 `@Service` 注解,以便 Tomcat 能够正确识别。 ```java @WebService @Service public class CalculatorImpl implements Calculator { @Override public int add(int a, int b) { return a + b; } @Override public int subtract(int a, int b) { return a - b; } } ``` 3. 配置 Tomcat 需要在 Tomcat 的 `web.xml` 文件添加以下配置: ```xml <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> ``` 这样就可以将 WebService 映射到 `/services` 路径下。 4. 发布 WebService 最后需要在 Tomcat 启动时发布 WebService,可以使用以下代码: ```java Endpoint.publish("/Calculator", new CalculatorImpl()); ``` 这样就可以在 `http://localhost:8080/services/Calculator` 访问 WebService 了。 以上是 Tomcat WebService 编码的基本步骤,具体实现还需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值