应用场景:第三方的系统提供了接口用于获取数据,返回值类型为json。通过发送指定请求的方式取到数据,处理数据并保存。
一、使用HttpUrlConnection发送请求
1.发送POST请求
/**
* 使用HttpUrlConnection发送POST请求并接收数据
*/
public String httpUrlConnection(String apiUrl){
try {
//1.创建URL 创建链接
URL url = new URL(apiUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//2.设置获取的数据类型
conn.setRequestProperty("Content-Type","application/json");
//3.设置编码格式
conn.setRequestProperty("Charset","UTF-8");
//4.维持长连接
conn.setRequestProperty("Connection","Keep-Alive");
conn.setReadTimeout(50000);
conn.setConnectTimeout(50000);
//5.设置请求方式
conn.setRequestMethod("POST");
conn.setDoOutput(true);
//6.设置 请求的内容 (请求体)
OutputStream os = conn.getOutputStream();
String json = "{}"; // POST请求的参数列表
os.write(json.getBytes());
os.flush();
os.close();
StringBuffer result = new StringBuffer();
//读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
}catch (Exception e){
e.printStackTrace();
}
return null;
}
2.发送GET请求
public List<Map> httpRequest(String apiPath, String marketCode, String tableName) {
//获取接口数据
BufferedReader in = null;
StringBuffer result = null;
List<Map> list = new ArrayList<>();
//调用的api的接口地址
String apiUrl = apiPath;
try {
URL url = new URL(apiPath);
//打开和url之间的连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置通用的请求属性
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Charset", "utf-8");
connection.connect();
result = new StringBuffer();
//读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
String result2 = result.toString();
//接口数据为List类型
JSONObject jsonObject = JSON.parseObject(result2);
if(jsonObject.getString("data") == null || jsonObject.getString("data").equals("[]")){
return null;
}else {
JSONArray jsonArray = JSONObject.parseObject(result2).getJSONArray("data");
list = jsonArray.toJavaList(Map.class);
return list;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
二、使用OKHttp发送请求
/**
* 获取接口数据并处理、保存
* 参数格式
* 1.apiPath 即需要访问的 url
* 2.startTime 和 endTime 格式为 yyyy-MM-dd
*/
public List<Map> httpRequest(String apiPath,String startTime,String endTime) throws Exception{
//拼接请求体中的json语句
String json = "{}"; //POST请求的参数列表
//设置MediaType(决定浏览器将以什么形式、什么编码对资源进行解析)
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
//1.创建okHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = RequestBody.create(json,JSON);
//2.创建Request对象,设置一个url,设置请求方式
Request request = new Request.Builder()
.url(apiPath)
.post(requestBody)
.build();
//3.获取响应信息
Response response = okHttpClient.newCall(request).execute();
//4.将响应体中的信息转化为字符串
String result = response.body().string();
//处理获取到的数据
JSONObject jsonObject = JSONObject.parseObject(result);
if(jsonObject.get("datas") == null){
return null;
}else {
String datas = jsonObject.get("datas").toString();
JSONArray jsonArray = JSONObject.parseArray(datas);
List<Map> saveList = new ArrayList();
saveList = jsonArray.toJavaList(Map.class);
for(int i = 0;i < saveList.size(); i ++){
saveList.get(i).put("date",startTime);
}
System.out.println(saveList);
apiMapper.saveData(saveList);
return saveList;
}
}
OKHttp的依赖:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>