您的位置:首页 > 编程语言 > Java开发

Spring for android实现客户端与服务器的通信

2014-03-27 16:55 357 查看
最近在做一个项目,涉及服务器与Android客户端的通信,是用springframework来实现的,下面是一些学习资料。

一、RestTemplate

官方文档http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
RestTemplate是spring的核心类。它强制基于REST的原则,简化了和HTTP服务器的交流。它可以处理HTTP连接;应用程序代码只需要提供URL和可能需要的模板变量,并提取结果就可以了。

RestTemplate的网络请求方法如下:

HTTP methodRestTemplate methods
DELETE
delete(java.lang.String, java.lang.Object...)
GET
getForObject(java.lang.String,
java.lang.Class<T>, java.lang.Object...)
getForEntity(java.lang.String,
java.lang.Class<T>, java.lang.Object...)
HEAD
headForHeaders(java.lang.String,
java.lang.Object...)
OPTIONS
optionsForAllow(java.lang.String,
java.lang.Object...)
POST
postForLocation(java.lang.String,
java.lang.Object, java.lang.Object...)
postForObject(java.lang.String,
java.lang.Object, java.lang.Class<T>, java.lang.Object...)
PUT
put(java.lang.String,
java.lang.Object, java.lang.Object...)
any
exchange(java.lang.String,
org.springframework.http.HttpMethod, org.springframework.http.HttpEntity<?>, java.lang.Class<T>, java.lang.Object...)
execute(java.lang.String,
org.springframework.http.HttpMethod, org.springframework.web.client.RequestCallback, org.springframework.web.client.ResponseExtractor<T>, java.lang.Object...)
二、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:未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: