最近在做一个项目,涉及服务器与Android客户端的通信,是用springframework来实现的,下面是一些学习资料。
一、RestTemplate
官方文档http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.htmlRestTemplate是spring的核心类。它强制基于REST的原则,简化了和HTTP服务器的交流。它可以处理HTTP连接;应用程序代码只需要提供URL和可能需要的模板变量,并提取结果就可以了。
RestTemplate的网络请求方法如下:
二、RestTemplate定义和初始化
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());
getMessageConverters()用来获得消息体(message body)转换器,这里添加了FormHttpMessageConverter、MappingJacksonHttpMessageConverter、ByteArrayHttpMessageConverter三个消息体转换器
1、Interface HttpMessageConverter<T>
这个接口用来指定一个转换器,可以在Http请求和响应之间相互转换。
2、FormHttpMessageConverter
实现了HttpMessageConverter接口,它可以处理表单数据,包括多段表单数据(如上传的文件)。
这个转换器可以编写application/x-www-form-urlencoded和multipart/form-data媒体类型,读取application/x-www-form-urlencoded媒体类型,但不能读取multipart/form-data。
3、MappingJacksonHttpMessageConverter
实现了HttpMessageConverter接口,它可以使用Jackson1.x的ObjectMapper来读写JSON。
这个对象可以用来绑定到指定类型的数据bean、或者无类型的HashMap实例中。
默认情况下,这个转换器支持application/json。
4、ByteArrayHttpMessageConverter
实现了HttpMessageConverter接口,它可以读写字节数组。
默认情况下,此转换器支持所有媒体类型(*/*)。
三、RestTemplate.exchange()
定义好RestTemplate后,直接调用exchange()函数,就可以将访问指定url返回的JSON自动解析到结果类ReceiveResult中:
private ReceiveResult getReceiveResult(String data){
HashMap<String, Object> urlVariables = new HashMap<String, Object>();
urlVariables.put("data", data);
// HTTP头部
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setAccept(Collections.singletonList(MediaType
.parseMediaType("application/json")));
// HTTP实体
HttpEntity<Object> requestEntity = new HttpEntity<Object>(httpHeaders);
return restTemplate.exchange(
rootUrl.concat("/.../.../.../...?id={data}"),
HttpMethod.GET,
requestEntity,
ReceiveResult.class,
urlVariables).getBody();
}
先看看exchange()函数:
public <T> ResponseEntity<T> exchange(String url,
HttpMethod method,
HttpEntity<?> requestEntity,
Class<T> responseType,
Map<String,?> uriVariables)
throws RestClientException
向指定的URI执行HTTP方法(GET、POST等),将指定的请求实体写到HTTP请求部分,并将HTTP响应作为ResponseEntity返回
-
参数:
-
url
- the URL -
method
- HTTP方法 (GET, POST, etc) -
requestEntity
- 要写入请求部分的实体(可以是HTTP头部和/或者HTTP Body),可为null
-
responseType
-返回值的类型 -
uriVariables
- 要在Uri中扩展添加的多个变量
返回:
- 把响应作为ResponseEntity实体返回 异常:
-
RestClientException
注意我的结果类ReceiveResult是用org.codehaus.jackson.annotate包来进行映射的。
public class ReceiverResult{
@JsonProperty("id")
private String id;
@JsonProperty("data")
private String data;
@JsonCreator
public ReceiverResult(@JsonProperty("id") String id,
@JsonProperty("data") String data) {
this.data = data;
this.id = id;
}
}
PS:未完待续