Spring for android实现客户端与服务器的通信
最近在做一个项目,涉及服务器与Android客户端的通信,是用springframework来实现的,下面是一些学习资料。
一、RestTemplate
官方文档http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.htmlRestTemplate是spring的核心类。它强制基于REST的原则,简化了和HTTP服务器的交流。它可以处理HTTP连接;应用程序代码只需要提供URL和可能需要的模板变量,并提取结果就可以了。
RestTemplate的网络请求方法如下:
HTTP method | RestTemplate methods |
---|---|
DELETE | delete(java.lang.String, java.lang.Object...) |
GET | getForObject(java.lang.String, java.lang.Class |
getForEntity(java.lang.String, java.lang.Class | |
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 | |
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 |
execute(java.lang.String, org.springframework.http.HttpMethod, org.springframework.web.client.RequestCallback, org.springframework.web.client.ResponseExtractor |
二、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
这个接口用来指定一个转换器,可以在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 urlVariables = new HashMap(); urlVariables.put("data", data); // HTTP头部 HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setAccept(Collections.singletonList(MediaType .parseMediaType("application/json"))); // HTTP实体 HttpEntity
先看看exchange()函数:
public ResponseEntity exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class responseType, Map 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:未完待续
更多相关文章
- 简单的通过request判断客户端设备类型
- Android Get Network Type获得网络类型
- js判断手机系统类型
- Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互
- Android 开发中Parcel存储类型和数据容器
- 从零学Android(八)、Android资源类型之Drawable资源
- android JNI java与C++传递String数组(引用类型)