Forest,这款轻量级 HTTP 客户端 API 框架很强( 五 )

/** * 使用 @Header 注解可以修饰 Map 类型的参数 * Map 的 Key 指为请求头的名称,Value 为请求头的值 * 通过此方式,可以将 Map 中所有的键值对批量地绑定到请求头中 */@Post("http://localhost:8080/hello/user?username=foo")void headHelloUser(@Header Map<String, Object> headerMap);/** * 使用 @Header 注解可以修饰自定义类型的对象参数 * 依据对象类的 Getter 和 Setter 的规则取出属性 * 其属性名为 URL 请求头的名称,属性值为请求头的值 * 以此方式,将一个对象中的所有属性批量地绑定到请求头中 */@Post("http://localhost:8080/hello/user?username=foo")void headHelloUser(@Header MyHeaderInfo headersInfo);4.1.7 HTTP Body在POST和PUT等请求方法中,通常使用 HTTP 请求体进行传输数据 。在 Forest 中有多种方式设置请求体数据 。
(1)@Body注解
您可以使用@Body注解修饰参数的方式,将传入参数的数据绑定到 HTTP 请求体中 。
/** * 默认body格式为 application/x-www-form-urlencoded,即以表单形式序列化数据 */@Post(url = "http://localhost:8080/user",headers = {"Accept:text/plain"})String sendPost(@Body("username") String username,@Body("password") String password);(2)表单格式
上面使用 @Body 注解的例子用的是普通的表单格式,也就是contentType属性为application/x-www-form-urlencoded的格式,即contentType不做配置时的默认值 。
表单格式的请求体以字符串 key1=value1&key2=value2&...&key{n}=value{n} 的形式进行传输数据,其中value都是已经过 URL Encode 编码过的字符串 。
/** * contentType属性设置为 application/x-www-form-urlencoded 即为表单格式, * 当然不设置的时候默认值也为 application/x-www-form-urlencoded, 也同样是表单格式 。* 在 @Body 注解的 value 属性中设置的名称为表单项的 key 名, * 而注解所修饰的参数值即为表单项的值,它可以为任何类型,不过最终都会转换为字符串进行传输 。*/@Post(url = "http://localhost:8080/user",contentType = "application/x-www-form-urlencoded",headers = {"Accept:text/plain"})String sendPost(@Body("key1") String value1,@Body("key2") Integer value2, @Body("key3") Long value3);(3)JSON格式
(4)XML格式
4.1.8 @BaseRequest注解@BaseRequest注解定义在接口类上,在@BaseRequest上定义的属性会被分配到该接口中每一个方法上,但方法上定义的请求属性会覆盖@BaseRequest上重复定义的内容 。因此可以认为@BaseRequest上定义的属性内容是所在接口中所有请求的默认属性 。
/** * @BaseRequest 为配置接口层级请求信息的注解, * 其属性会成为该接口下所有请求的默认属性, * 但可以被方法上定义的属性所覆盖 */@BaseRequest(baseURL = "http://localhost:8080",// 默认域名headers = {"Accept:text/plain"// 默认请求头},sslProtocol = "TLS"// 默认单向SSL协议)public interface MyClient {// 方法的URL不必再写域名部分@Get("/hello/user")String send1(@Query("username") String username);// 若方法的URL是完整包含http://开头的,那么会以方法的URL中域名为准,不会被接口层级中的baseURL属性覆盖@Get("http://www.xxx.com/hello/user")String send2(@Query("username") String username);@Get(url = "/hello/user",headers = {"Accept:application/json"// 覆盖接口层级配置的请求头信息})String send3(@Query("username") String username);}4.1.9 数据转换(1)序列化
Forest中对数据进行序列化可以通过指定contentType属性或Content-Type头指定内容格式 。
@Request(url = "http://localhost:8080/hello/user",type = "post",contentType = "application/json"// 指定contentType为application/json)String postJson(@Body MyUser user);// 自动将user对象序列化为JSON格式同理,指定为application/xml会将参数序列化为XML格式,text/plain则为文本,默认的application/x-www-form-urlencoded则为表格格式 。
(2)反序列化
HTTP请求响应后返回结果的数据同样需要转换,Forest则会将返回结果自动转换为您通过方法返回类型指定对象类型 。这个过程就是反序列化,您可以通过dataType指定返回数据的反序列化格式 。
@Request(url = "http://localhost:8080/data",dataType = "json"// 指定dataType为json,将按JSON格式反序列化数据)Map getData();// 请求响应的结果将被转换为Map类型对象4.1.10 日志管理Forest在发送请求时和接受响应数据时都会自动打印出HTTP请求相关的日志,其中包括:请求日志、响应状态日志、响应内容日志 。扩展:最全的java面试题库


推荐阅读