分布式计算第五周实验:RESTful 客户端编程

课程地址

http://ss.sysu.edu.cn/~pml/dct/5_restful_client.html

实验内容

  1. 写出实验 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"

    这里写图片描述

  2. 简述 问题 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();
    }
  3. 实验 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。

  4. 实验 1 中,简述 CachedOutputStream 类的作用是什么?

    作为数据的缓冲区,从输入流中读取一定数量的字节,并将其存储在缓冲区中,而不需要循环读取输入源。

  5. 翻译 jersey 文档 5.1. Uniform Interface Constraint 的 5 个目标。

    1. 简易的,结构要易于理解与维护。和可升级的,耦合度低的。客户端与服务端可随着时间不断地升级,需要有向后兼容的能力。
    2. 每一个资源由URI标识。
    3. 客户端通过HTTP请求与响应使用一套固定的HTTP方法来与资源进行交互。
    4. 一个或多个代理可被返回并通过媒体类型被识别。
    5. 内容可连接到更深入的资源。
  6. 简述实验 2 中官方文档 5.2 提到的 UriBuilder 类的作用。

    提供了从不同资源创建URI,修改URI实例的方法。

  7. 阅读实验 3 官方文档,用自己的语言(中文)陈述 Motivation for Reactive Client 。

    Reactive方法是一种可以摆脱Java回调地狱的方法,基于数据流概念和通过流来改变执行模型的传播。当Jax-RS请求完成后,数据流中的下一个项目(或用户代码)被声明是延续,完成或者失败。你描述的是接下来该做什么而不是接下来的动作该怎么触发。数据流是可组合的,可以把多个数据流组成一个结果并对其进行操作。

    当我们需要处理大量的请求(相互依赖),并且需要把请求组成一个结果时,Reactive编程模式是个不错的选择。

  8. (!)给出一个可运行的实验程序,包含在作业中。

  9. 阅读实验 4 官方文档,为什么 Java 写 web 服务必须先声明接口?通常这样的接口必须放在一个独立的 Java 文件中。

    定义一系列的公用接口,多子类可实现,便于以后扩展,维护和节约有效的时间,相同接口,但是可有不同实现,互不干扰。

  10. JAXRSClientFactory 类的作用是什么?

    创建代理客户端。

  11. 简述透明代理的作用。

    图解正向代理、反向代理、透明代理

    这里写图片描述

    用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值