Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架一:Jersey RESTful WebService框架简介

Jersey框架一:Jersey RESTful WebService框架简介

Jersey系列文章:

Jersey框架一:Jersey RESTful WebService框架简介

Jersey框架二:Jersey对JSON的支持

Jersey框架三:Jersey对HTTPS的支持

开发RESTful WebService意味着支持在多种媒体类型以及抽象底层的客户端-服务器通信细节,如果没有一个好的工具包可用,这将是一个困难的任务

为了简化使用JAVA开发RESTful WebService及其客户端,一个轻量级的标准被提出:JAX-RS API

Jersey RESTful WebService框架是一个开源的、产品级别的JAVA框架,支持JAX-RS API并且是一个JAX-RS(JSR 311和 JSR 339)的参考实现

Jersey不仅仅是一个JAX-RS的参考实现,Jersey提供自己的API,其API继承自JAX-RS,提供更多的特性和功能以进一步简化RESTful service和客户端的开发

Maven版本:3.1.0

扫描二维码关注公众号,回复: 1855998 查看本文章

Jersey版本:1.18

JDK版本:1.7.0_65

一,服务端

Maven配置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>JERSEY_SERVER </groupId>
  7. <artifactId>JERSEY_SERVER </artifactId>
  8. <version>1.0 </version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.sun.jersey </groupId>
  12. <artifactId>jersey-server </artifactId>
  13. <version>1.18 </version>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.sun.jersey </groupId>
  17. <artifactId>jersey-grizzly2 </artifactId>
  18. <version>1.18 </version>
  19. </dependency>
  20. </dependencies>
  21. </project>

首先介绍几个注解:

@Path

用来为资源类或方法定义URI,当然除了静态URI也支持动态URI

  1. @Path( "service")
  2. public class MyResource {
  3. @Path( "{sub_path}")
  4. @GET
  5. public String getResource(@PathParam("sub_path") String resourceName) {
  6. ......

如果此时客户端请求的URI为http://127.0.0.1:10000/service/sean,则sub_path的值为sean

@PathParam用来将请求URI的一部分作为方法参数传入方法中

对URI的动态部分,可以自定义校验正则表达式,如果请求参数校验失败,容器返回404 Not Found

@Path("{sub_path:[A-Z]*}")

@GET

表明被注解的方法响应HTTP GET请求,@POST@PUT@DELETE同理

@Consumes

定义请求的媒体类型,如果不指定,则容器默认可接受任意媒体类型,容器负责确认被调用的方法可接受HTTP请求的媒体类型,否则返回415 Unsupported Media Type

方法级注解将覆盖类级注解

@Produces

定义响应媒体类型,如果不指定,则容器默认可接受任意媒体类型,容器负责确认被调用的方法可返回HTTP请求可以接受媒体类型,否则返回406 Not Acceptable

方法级注解将覆盖类级注解

@QueryParam

  1. public String getResource(
  2. @DefaultValue("Just a test!") @ QueryParam ("desc") String description) {
  3. ......
  4. }

如果请求URI中包含desc参数,例如:http://127.0.0.1:10000/service/sean?desc=123456,则desc参数的值将会赋给方法的参数description,否则方法参数description的值将为@DefaultValue注解定义的默认值

@Context

将信息注入请求或响应相关的类,可注入的类有:Application,UriInfo,Request,HttpHeaders和SecurityContext

@Singleton@PerRequest

默认情况下,资源类的生命周期是per-request,也就是系统会为每个匹配资源类URI的请求创建一个实例,这样的效率很低,可以对资源类使用@Singleton注解,这样在应用范围内,只会创建资源类的一个实例

服务端程序如下:

  1. package com.sean;
  2. import java.io.IOException;
  3. import java.net.URI;
  4. import java.util.Iterator;
  5. import javax.ws.rs.Consumes;
  6. import javax.ws.rs.DefaultValue;
  7. import javax.ws.rs.GET;
  8. import javax.ws.rs.Path;
  9. import javax.ws.rs.PathParam;
  10. import javax.ws.rs.Produces;
  11. import javax.ws.rs.QueryParam;
  12. import javax.ws.rs.core.Context;
  13. import javax.ws.rs.core.HttpHeaders;
  14. import javax.ws.rs.core.MediaType;
  15. import javax.ws.rs.core.MultivaluedMap;
  16. import javax.ws.rs.core.Request;
  17. import javax.ws.rs.core.UriBuilder;
  18. import javax.ws.rs.core.UriInfo;
  19. import org.glassfish.grizzly.http.server.HttpServer;
  20. import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
  21. import com.sun.jersey.api.core.PackagesResourceConfig;
  22. import com.sun.jersey.api.core.ResourceConfig;
  23. import com.sun.jersey.spi.resource.Singleton;
  24. @Singleton
  25. @Path( "service")
  26. public class MyResource {
  27. @Path( "{sub_path:[a-zA-Z0-9]*}")
  28. @GET
  29. @Consumes({MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON})
  30. @Produces(MediaType.TEXT_PLAIN)
  31. public String getResourceName(
  32. @PathParam("sub_path") String resourceName,
  33. @DefaultValue("Just a test!") @QueryParam("desc") String description,
  34. @Context Request request,
  35. @Context UriInfo uriInfo,
  36. @Context HttpHeaders httpHeader) {
  37. System.out.println( this.hashCode());
  38. // 将HTTP请求打印出来
  39. System.out.println( "****** HTTP request ******");
  40. StringBuilder strBuilder = new StringBuilder();
  41. strBuilder.append(request.getMethod() + " ");
  42. strBuilder.append(uriInfo.getRequestUri().toString() + " ");
  43. strBuilder.append( "HTTP/1.1[\\r\\n]");
  44. System.out.println(strBuilder.toString());
  45. MultivaluedMap<String, String> headers = httpHeader.getRequestHeaders();
  46. Iterator<String> iterator = headers.keySet().iterator();
  47. while(iterator.hasNext()){
  48. String headName = iterator.next();
  49. System.out.println(headName + ":" + headers.get(headName) + "[\\r\\n]");
  50. }
  51. System.out.println( "[\\r\\n]");
  52. String responseStr =resourceName + "[" + description + "]";
  53. return responseStr;
  54. }
  55. public static void main(String[] args) {
  56. URI uri = UriBuilder.fromUri( "http://127.0.0.1").port( 10000).build();
  57. ResourceConfig rc = new PackagesResourceConfig( "com.sean");
  58. try {
  59. HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);
  60. server.start();
  61. } catch (IllegalArgumentException e) {
  62. e.printStackTrace();
  63. } catch (NullPointerException e) {
  64. e.printStackTrace();
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68. try {
  69. Thread.sleep( 1000* 1000);
  70. } catch (InterruptedException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }

二,客户端

Maven配置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>JERSEY_CLIENT </groupId>
  7. <artifactId>JERSEY_CLIENT </artifactId>
  8. <version>1.0 </version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.sun.jersey </groupId>
  12. <artifactId>jersey-client </artifactId>
  13. <version>1.18 </version>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.sun.jersey </groupId>
  17. <artifactId>jersey-grizzly2 </artifactId>
  18. <version>1.18 </version>
  19. </dependency>
  20. </dependencies>
  21. </project>

客户端程序如下:

  1. package com.sean;
  2. import java.net.URI;
  3. import java.util.Iterator;
  4. import javax.ws.rs.core.MediaType;
  5. import javax.ws.rs.core.MultivaluedMap;
  6. import javax.ws.rs.core.UriBuilder;
  7. import com.sun.jersey.api.client.Client;
  8. import com.sun.jersey.api.client.ClientResponse;
  9. import com.sun.jersey.api.client.WebResource;
  10. import com.sun.jersey.api.client.config.ClientConfig;
  11. import com.sun.jersey.api.client.config.DefaultClientConfig;
  12. public class JerseyClient {
  13. public static void main(String[] args) {
  14. // 要使用Jersey Client API,必须首先创建Client的实例
  15. // 有以下两种创建Client实例的方式
  16. // 方式一
  17. ClientConfig cc = new DefaultClientConfig();
  18. cc.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10* 1000);
  19. // Client实例很消耗系统资源,需要重用
  20. // 创建web资源,创建请求,接受响应都是线程安全的
  21. // 所以Client实例和WebResource实例可以在多个线程间安全的共享
  22. Client client = Client.create(cc);
  23. // 方式二
  24. // Client client = Client.create();
  25. // client.setConnectTimeout(10*1000);
  26. // client.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10*1000);
  27. // WebResource将会继承Client中timeout的配置
  28. WebResource resource = client.resource( "http://127.0.0.1:10000/service/sean?desc=description");
  29. String str = resource
  30. .accept(MediaType.TEXT_PLAIN)
  31. .type(MediaType.TEXT_PLAIN)
  32. .get(String.class);
  33. System.out.println( "String:" + str);
  34. URI uri = UriBuilder.fromUri( "http://127.0.0.1/service/sean").port( 10000)
  35. .queryParam( "desc", "description").build();
  36. resource = client.resource(uri);
  37. //header方法可用来添加HTTP头
  38. ClientResponse response = resource.header( "auth", "123456")
  39. .accept(MediaType.TEXT_PLAIN)
  40. .type(MediaType.TEXT_PLAIN)
  41. .get(ClientResponse.class);
  42. // 将HTTP响应打印出来
  43. System.out.println( "****** HTTP response ******");
  44. StringBuilder strBuilder = new StringBuilder();
  45. strBuilder.append( "HTTP/1.1 ");
  46. strBuilder.append(response.getStatus() + " ");
  47. strBuilder.append(response.getStatusInfo() + "[\\r\\n]");
  48. System.out.println(strBuilder.toString());
  49. MultivaluedMap<String, String> headers = response.getHeaders();
  50. Iterator<String> iterator = headers.keySet().iterator();
  51. while(iterator.hasNext()){
  52. String headName = iterator.next();
  53. System.out.println(headName + ":" + headers.get(headName) + "[\\r\\n]");
  54. }
  55. System.out.println( "[\\r\\n]");
  56. System.out.println(response.getEntity(String.class) + "[\\r\\n]");
  57. }
  58. }

服务端日志如下:

二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  com.sean
二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class com.sean.Test
  class com.sean.MyResource
二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
二月 06, 2015 4:33:33 下午 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18 11/22/2013 01:21 AM'
二月 06, 2015 4:33:34 下午 org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [127.0.0.1:10000]
二月 06, 2015 4:33:34 下午 org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
1814260800
****** HTTP request ******
GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r\n]
accept:[text/plain][\r\n]
content-type:[text/plain][\r\n]
user-agent:[Java/1.7.0_65][\r\n]
host:[127.0.0.1:10000][\r\n]
connection:[keep-alive][\r\n]
[\r\n]
1814260800
****** HTTP request ******
GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r\n]
auth:[123456][\r\n]
accept:[text/plain][\r\n]
content-type:[text/plain][\r\n]
user-agent:[Java/1.7.0_65][\r\n]
host:[127.0.0.1:10000][\r\n]
connection:[keep-alive][\r\n]
[\r\n]

客户端日志如下:

String:sean[description]
****** HTTP response ******
HTTP/1.1 200 OK[\r\n]
Transfer-Encoding:[chunked][\r\n]
Date:[Fri, 06 Feb 2015 08:33:38 GMT][\r\n]
Content-Type:[text/plain][\r\n]
[\r\n]
sean[description][\r\n]

Jersey系列文章:

Jersey框架一:Jersey RESTful WebService框架简介

Jersey框架二:Jersey对JSON的支持

Jersey框架三:Jersey对HTTPS的支持

开发RESTful WebService意味着支持在多种媒体类型以及抽象底层的客户端-服务器通信细节,如果没有一个好的工具包可用,这将是一个困难的任务

为了简化使用JAVA开发RESTful WebService及其客户端,一个轻量级的标准被提出:JAX-RS API

Jersey RESTful WebService框架是一个开源的、产品级别的JAVA框架,支持JAX-RS API并且是一个JAX-RS(JSR 311和 JSR 339)的参考实现

Jersey不仅仅是一个JAX-RS的参考实现,Jersey提供自己的API,其API继承自JAX-RS,提供更多的特性和功能以进一步简化RESTful service和客户端的开发

Maven版本:3.1.0

Jersey版本:1.18

JDK版本:1.7.0_65

一,服务端

Maven配置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>JERSEY_SERVER </groupId>
  7. <artifactId>JERSEY_SERVER </artifactId>
  8. <version>1.0 </version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.sun.jersey </groupId>
  12. <artifactId>jersey-server </artifactId>
  13. <version>1.18 </version>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.sun.jersey </groupId>
  17. <artifactId>jersey-grizzly2 </artifactId>
  18. <version>1.18 </version>
  19. </dependency>
  20. </dependencies>
  21. </project>

首先介绍几个注解:

@Path

用来为资源类或方法定义URI,当然除了静态URI也支持动态URI

  1. @Path( "service")
  2. public class MyResource {
  3. @Path( "{sub_path}")
  4. @GET
  5. public String getResource(@PathParam("sub_path") String resourceName) {
  6. ......

如果此时客户端请求的URI为http://127.0.0.1:10000/service/sean,则sub_path的值为sean

@PathParam用来将请求URI的一部分作为方法参数传入方法中

对URI的动态部分,可以自定义校验正则表达式,如果请求参数校验失败,容器返回404 Not Found

@Path("{sub_path:[A-Z]*}")

@GET

表明被注解的方法响应HTTP GET请求,@POST@PUT@DELETE同理

@Consumes

定义请求的媒体类型,如果不指定,则容器默认可接受任意媒体类型,容器负责确认被调用的方法可接受HTTP请求的媒体类型,否则返回415 Unsupported Media Type

方法级注解将覆盖类级注解

@Produces

定义响应媒体类型,如果不指定,则容器默认可接受任意媒体类型,容器负责确认被调用的方法可返回HTTP请求可以接受媒体类型,否则返回406 Not Acceptable

方法级注解将覆盖类级注解

@QueryParam

  1. public String getResource(
  2. @DefaultValue("Just a test!") @ QueryParam ("desc") String description) {
  3. ......
  4. }

如果请求URI中包含desc参数,例如:http://127.0.0.1:10000/service/sean?desc=123456,则desc参数的值将会赋给方法的参数description,否则方法参数description的值将为@DefaultValue注解定义的默认值

@Context

将信息注入请求或响应相关的类,可注入的类有:Application,UriInfo,Request,HttpHeaders和SecurityContext

@Singleton@PerRequest

默认情况下,资源类的生命周期是per-request,也就是系统会为每个匹配资源类URI的请求创建一个实例,这样的效率很低,可以对资源类使用@Singleton注解,这样在应用范围内,只会创建资源类的一个实例

服务端程序如下:

  1. package com.sean;
  2. import java.io.IOException;
  3. import java.net.URI;
  4. import java.util.Iterator;
  5. import javax.ws.rs.Consumes;
  6. import javax.ws.rs.DefaultValue;
  7. import javax.ws.rs.GET;
  8. import javax.ws.rs.Path;
  9. import javax.ws.rs.PathParam;
  10. import javax.ws.rs.Produces;
  11. import javax.ws.rs.QueryParam;
  12. import javax.ws.rs.core.Context;
  13. import javax.ws.rs.core.HttpHeaders;
  14. import javax.ws.rs.core.MediaType;
  15. import javax.ws.rs.core.MultivaluedMap;
  16. import javax.ws.rs.core.Request;
  17. import javax.ws.rs.core.UriBuilder;
  18. import javax.ws.rs.core.UriInfo;
  19. import org.glassfish.grizzly.http.server.HttpServer;
  20. import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
  21. import com.sun.jersey.api.core.PackagesResourceConfig;
  22. import com.sun.jersey.api.core.ResourceConfig;
  23. import com.sun.jersey.spi.resource.Singleton;
  24. @Singleton
  25. @Path( "service")
  26. public class MyResource {
  27. @Path( "{sub_path:[a-zA-Z0-9]*}")
  28. @GET
  29. @Consumes({MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON})
  30. @Produces(MediaType.TEXT_PLAIN)
  31. public String getResourceName(
  32. @PathParam("sub_path") String resourceName,
  33. @DefaultValue("Just a test!") @QueryParam("desc") String description,
  34. @Context Request request,
  35. @Context UriInfo uriInfo,
  36. @Context HttpHeaders httpHeader) {
  37. System.out.println( this.hashCode());
  38. // 将HTTP请求打印出来
  39. System.out.println( "****** HTTP request ******");
  40. StringBuilder strBuilder = new StringBuilder();
  41. strBuilder.append(request.getMethod() + " ");
  42. strBuilder.append(uriInfo.getRequestUri().toString() + " ");
  43. strBuilder.append( "HTTP/1.1[\\r\\n]");
  44. System.out.println(strBuilder.toString());
  45. MultivaluedMap<String, String> headers = httpHeader.getRequestHeaders();
  46. Iterator<String> iterator = headers.keySet().iterator();
  47. while(iterator.hasNext()){
  48. String headName = iterator.next();
  49. System.out.println(headName + ":" + headers.get(headName) + "[\\r\\n]");
  50. }
  51. System.out.println( "[\\r\\n]");
  52. String responseStr =resourceName + "[" + description + "]";
  53. return responseStr;
  54. }
  55. public static void main(String[] args) {
  56. URI uri = UriBuilder.fromUri( "http://127.0.0.1").port( 10000).build();
  57. ResourceConfig rc = new PackagesResourceConfig( "com.sean");
  58. try {
  59. HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);
  60. server.start();
  61. } catch (IllegalArgumentException e) {
  62. e.printStackTrace();
  63. } catch (NullPointerException e) {
  64. e.printStackTrace();
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68. try {
  69. Thread.sleep( 1000* 1000);
  70. } catch (InterruptedException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }

二,客户端

Maven配置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>JERSEY_CLIENT </groupId>
  7. <artifactId>JERSEY_CLIENT </artifactId>
  8. <version>1.0 </version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.sun.jersey </groupId>
  12. <artifactId>jersey-client </artifactId>
  13. <version>1.18 </version>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.sun.jersey </groupId>
  17. <artifactId>jersey-grizzly2 </artifactId>
  18. <version>1.18 </version>
  19. </dependency>
  20. </dependencies>
  21. </project>

客户端程序如下:

  1. package com.sean;
  2. import java.net.URI;
  3. import java.util.Iterator;
  4. import javax.ws.rs.core.MediaType;
  5. import javax.ws.rs.core.MultivaluedMap;
  6. import javax.ws.rs.core.UriBuilder;
  7. import com.sun.jersey.api.client.Client;
  8. import com.sun.jersey.api.client.ClientResponse;
  9. import com.sun.jersey.api.client.WebResource;
  10. import com.sun.jersey.api.client.config.ClientConfig;
  11. import com.sun.jersey.api.client.config.DefaultClientConfig;
  12. public class JerseyClient {
  13. public static void main(String[] args) {
  14. // 要使用Jersey Client API,必须首先创建Client的实例
  15. // 有以下两种创建Client实例的方式
  16. // 方式一
  17. ClientConfig cc = new DefaultClientConfig();
  18. cc.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10* 1000);
  19. // Client实例很消耗系统资源,需要重用
  20. // 创建web资源,创建请求,接受响应都是线程安全的
  21. // 所以Client实例和WebResource实例可以在多个线程间安全的共享
  22. Client client = Client.create(cc);
  23. // 方式二
  24. // Client client = Client.create();
  25. // client.setConnectTimeout(10*1000);
  26. // client.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10*1000);
  27. // WebResource将会继承Client中timeout的配置
  28. WebResource resource = client.resource( "http://127.0.0.1:10000/service/sean?desc=description");
  29. String str = resource
  30. .accept(MediaType.TEXT_PLAIN)
  31. .type(MediaType.TEXT_PLAIN)
  32. .get(String.class);
  33. System.out.println( "String:" + str);
  34. URI uri = UriBuilder.fromUri( "http://127.0.0.1/service/sean").port( 10000)
  35. .queryParam( "desc", "description").build();
  36. resource = client.resource(uri);
  37. //header方法可用来添加HTTP头
  38. ClientResponse response = resource.header( "auth", "123456")
  39. .accept(MediaType.TEXT_PLAIN)
  40. .type(MediaType.TEXT_PLAIN)
  41. .get(ClientResponse.class);
  42. // 将HTTP响应打印出来
  43. System.out.println( "****** HTTP response ******");
  44. StringBuilder strBuilder = new StringBuilder();
  45. strBuilder.append( "HTTP/1.1 ");
  46. strBuilder.append(response.getStatus() + " ");
  47. strBuilder.append(response.getStatusInfo() + "[\\r\\n]");
  48. System.out.println(strBuilder.toString());
  49. MultivaluedMap<String, String> headers = response.getHeaders();
  50. Iterator<String> iterator = headers.keySet().iterator();
  51. while(iterator.hasNext()){
  52. String headName = iterator.next();
  53. System.out.println(headName + ":" + headers.get(headName) + "[\\r\\n]");
  54. }
  55. System.out.println( "[\\r\\n]");
  56. System.out.println(response.getEntity(String.class) + "[\\r\\n]");
  57. }
  58. }

服务端日志如下:

二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  com.sean
二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class com.sean.Test
  class com.sean.MyResource
二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
二月 06, 2015 4:33:33 下午 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18 11/22/2013 01:21 AM'
二月 06, 2015 4:33:34 下午 org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [127.0.0.1:10000]
二月 06, 2015 4:33:34 下午 org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
1814260800
****** HTTP request ******
GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r\n]
accept:[text/plain][\r\n]
content-type:[text/plain][\r\n]
user-agent:[Java/1.7.0_65][\r\n]
host:[127.0.0.1:10000][\r\n]
connection:[keep-alive][\r\n]
[\r\n]
1814260800
****** HTTP request ******
GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r\n]
auth:[123456][\r\n]
accept:[text/plain][\r\n]
content-type:[text/plain][\r\n]
user-agent:[Java/1.7.0_65][\r\n]
host:[127.0.0.1:10000][\r\n]
connection:[keep-alive][\r\n]
[\r\n]

客户端日志如下:

String:sean[description]
****** HTTP response ******
HTTP/1.1 200 OK[\r\n]
Transfer-Encoding:[chunked][\r\n]
Date:[Fri, 06 Feb 2015 08:33:38 GMT][\r\n]
Content-Type:[text/plain][\r\n]
[\r\n]
sean[description][\r\n]

猜你喜欢

转载自blog.csdn.net/andyliulin/article/details/80890518