课程地址
http://ss.sysu.edu.cn/~pml/dct/5_restful_client.html
实验内容
写出实验 1 中执行 // Sent HTTP PUT request to update customer info 对应的 curl,与输出结果。
curl -v -H "Content-Type: application/xml" -d "<?xml version='1.0'?><Customer><name>Mary</name><id>123</id></Customer>" -X PUT "http://localhost:9000/customerservice/customers"
简述 问题 1 中对应程序执行的过程。
System.out.println("Sent HTTP PUT request to update customer info"); // 1. 建立新的客户端 Client client = new Client(); // 2. 把update_customer.xml中的文本转换为文件 String inputFile = client.getClass().getResource("/update_customer.xml").getFile(); URIResolver resolver = new URIResolver(inputFile); File input = new File(resolver.getURI()); // 3. 新建PUT请求,连接的地址为http://localhost:9000/customerservice/customers PutMethod put = new PutMethod("http://localhost:9000/customerservice/customers"); // 4. 设置请求的参数,输入文件,文件类型 RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1"); // 5. 设置PUT请求的参数 put.setRequestEntity(entity); // 6. 建立http客户端 HttpClient httpclient = new HttpClient(); try { // 7. 获取返回结果编号 int result = httpclient.executeMethod(put); System.out.println("Response status code: " + result); System.out.println("Response body: "); // 8. 输出PUT请求的返回结果 System.out.println(put.getResponseBodyAsString()); } finally { // Release current connection to the connection pool once you are // done put.releaseConnection(); }
实验 1 中,简述 URIResolver 类的作用是什么?
看了一下源码和
public URIResolver(String baseUriStr, String uriStr, Class<?> calling) throws IOException { this.cache = new HashMap(); this.calling = calling != null?calling:this.getClass(); if(uriStr.startsWith("classpath:")) { this.tryClasspath(uriStr); } else if(baseUriStr != null && (baseUriStr.startsWith("jar:") || baseUriStr.startsWith("zip:") || baseUriStr.startsWith("wsjar:"))) { this.tryArchive(baseUriStr, uriStr); } else if(!uriStr.startsWith("jar:") && !uriStr.startsWith("zip:") && !uriStr.startsWith("wsjar:")) { this.tryFileSystem(baseUriStr, uriStr); } else { this.tryArchive(uriStr); } }
输出了使用URIResolver转换前后的结果
可见URIResolver 类的作用是把输入的地址字符串转换成带文件类型的URL。
实验 1 中,简述 CachedOutputStream 类的作用是什么?
作为数据的缓冲区,从输入流中读取一定数量的字节,并将其存储在缓冲区中,而不需要循环读取输入源。
翻译 jersey 文档 5.1. Uniform Interface Constraint 的 5 个目标。
- 简易的,结构要易于理解与维护。和可升级的,耦合度低的。客户端与服务端可随着时间不断地升级,需要有向后兼容的能力。
- 每一个资源由URI标识。
- 客户端通过HTTP请求与响应使用一套固定的HTTP方法来与资源进行交互。
- 一个或多个代理可被返回并通过媒体类型被识别。
- 内容可连接到更深入的资源。
简述实验 2 中官方文档 5.2 提到的 UriBuilder 类的作用。
提供了从不同资源创建URI,修改URI实例的方法。
阅读实验 3 官方文档,用自己的语言(中文)陈述 Motivation for Reactive Client 。
Reactive方法是一种可以摆脱Java回调地狱的方法,基于数据流概念和通过流来改变执行模型的传播。当Jax-RS请求完成后,数据流中的下一个项目(或用户代码)被声明是延续,完成或者失败。你描述的是接下来该做什么而不是接下来的动作该怎么触发。数据流是可组合的,可以把多个数据流组成一个结果并对其进行操作。
当我们需要处理大量的请求(相互依赖),并且需要把请求组成一个结果时,Reactive编程模式是个不错的选择。
(!)给出一个可运行的实验程序,包含在作业中。
阅读实验 4 官方文档,为什么 Java 写 web 服务必须先声明接口?通常这样的接口必须放在一个独立的 Java 文件中。
定义一系列的公用接口,多子类可实现,便于以后扩展,维护和节约有效的时间,相同接口,但是可有不同实现,互不干扰。
JAXRSClientFactory 类的作用是什么?
创建代理客户端。
简述透明代理的作用。
用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。