Apache HttpClient调用Spring3 MVC Restful Web API演示
使用HttpRequest提交数据与HttpResponse响应客户端都是支持json数据格式,实现在HTTP Client端调用Spring3 MVC Restful API例子。需要用到的maven依赖如下:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.5</version>
</dependency>
添加了maven依赖之后,就可以先完成HttpClient演示程序,这里分别实现了从服务器上拉取一个list对象、提交一个对象json数据到服务器上请求创建两个操作,分别对应Http的GET与POST请求。完整的实现代码如下:
package com.httpclient.demo;
import java.io.IOException;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class HttpClientDemo {
public static void main(String[] args) {
HttpClient httpClient = HttpClientBuilder.create().build(); // Use this
// instead
HttpGet request = new HttpGet("http://localhost:8080/clotherdye/api/myTest/list");
request.addHeader("content-type", "application/json");
request.addHeader("Accept", "application/json");
try {
// get with json
HttpResponse httpResponse = httpClient.execute(request);
String response = EntityUtils.toString(httpResponse.getEntity());
Gson gson = new Gson();
List<PersonDto> embossList = gson.fromJson(response, new TypeToken<List<PersonDto>>(){}.getType());
if(embossList != null && embossList.size() > 0)
{
System.out.println("Name = " + embossList.get(0).getName());
System.out.println("Country = " + embossList.get(0).getCountry());
System.out.println("dddddddddd");
}
// post data with json
HttpPost httpPost = new HttpPost("http://localhost:8080/clotherdye/api/myTest/create");
httpPost.addHeader("content-type", "application/json");
httpPost.addHeader("Accept", "application/json");
PersonDto dto = new PersonDto();
dto.setName("http-client");
dto.setHobby("json parser");
dto.setCountry("US");
dto.setDegree("本科");
dto.setOccupy("tester");
String jsonString = gson.toJson(dto);
StringEntity entity = new StringEntity(jsonString);
httpPost.setEntity(entity);
httpResponse = httpClient.execute(httpPost);
response = EntityUtils.toString(httpResponse.getEntity());
System.out.println(response);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
Person对象类的代码如下:
public class PersonDto { public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getDegree() { return degree; } public void setDegree(String degree) { this.degree = degree; } public String getOccupy() { return occupy; } public void setOccupy(String occupy) { this.occupy = occupy; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } private String name; private String country; private String degree; private String occupy; private String hobby; }
服务器端是基于Spring3 MVC开发的Controller接口类,代码如下
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/api/myTest")
public class RestfulAPIController {
@RequestMapping("/list")
public @ResponseBody List<PersonDto> getList() {
List<PersonDto> persons = new ArrayList<PersonDto>();
PersonDto p1 = new PersonDto();
p1.setCountry("中国");
p1.setDegree("本科");
p1.setHobby("编程");
p1.setName("zhigang");
p1.setOccupy("程序员");
PersonDto p2 = new PersonDto();
p2.setCountry("中国");
p2.setDegree("本科");
p2.setHobby("图像处理");
p2.setName("jia20003");
p2.setOccupy("码农");
persons.add(p1);
persons.add(p2);
System.out.println("start to get PersonDto list");
return persons;
}
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> createMember(@RequestBody PersonDto dto)
{
System.out.println(dto.getName());
System.out.println(dto.getOccupy());
Map<String, Object> map = new HashMap<String, Object>();
map.put("success", dto.getName() + "创建成功!");
return map;
}
}
需要特别说明的是Restful Web API应该严格遵守Http的四个操作:
GET对应查询操作
POST对应创建操作
PUT对应更新操作
DELETE对应删除操作
不应该再有其它任何操作,也就是说从HttpClient发过来的Request类型只能
是上述四种之一。否则不能称为Restful API。
JSON对象解析在HttpClient端我用了google json解析包,比较好用
推荐大家用。