需求场景:一个服务器的项目a需要用到另外一个服务器项目b的数据。
我这里直接在a里面发请求,请求b对应的地址,b返回的是json类型的数据,然后在a里面解析这一串json就行了。详细经过看图。
1.项目a里面发请求get或者post
//远程连接请求数据 String data = HttpUtils.get("http://192.168.1.112:8081/openapi/carChargeBLH_flightInfoManageSearch.do?flight_date=1", null); // data = HttpUtils.post("http://192.168.1.112:8081/openapi/carChargeBLH_flightInfoManageSearch.do", "");
2.我这里用到了一个httputils的工具类,也贴上来给大家看看,主要用于便于发送请求。
package com.util; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.nio.charset.Charset; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.X509TrustManager; import org.apache.log4j.Logger; /** * Http 访问工具类 * */ public class HttpUtils { private final static Logger logger = Logger.getLogger(HttpUtils.class); /** * 证书信任管理器(用于https请求) * */ public static class MyX509TrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } } /** * GET请求 默认是 utf-8 编码 * * @param url * @param params * @return */ public static String get(String url, String params) { return get(url, params, Charset.forName("utf-8")); } /** * GET请求 * * @param url * 请求URL * @return */ public static String get(String url, String params, Charset charset) { String result = ""; InputStream in = null; if (null != params && !params.equals("")) { if (url.contains("?")) {// 包含?,后面加&直接填加 url += "&" + params; } else { url += "?" + params; } } try { URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); conn.connect(); in = conn.getInputStream(); result = readInputStream(charset, in); } catch (Exception e) { throw new RuntimeException(e); } finally { try { if (in != null) { in.close(); } } catch (IOException ex) { } } logger.info("result=----" + result); return result; } /** * POST请求 默认是 utf-8 编码 * * @param url * @param params * @return */ public static String post(String url, String params) { return post(url, params, Charset.forName("utf-8")); } /** * POST请求 * * @param url * 请求URL * @param param * 请求参数,请求参数格式 name1=value1&name2=value2 * @return */ public static String post(String url, String param, Charset charset) { PrintWriter out = null; InputStream in = null; String result = ""; try { URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); out = new PrintWriter(conn.getOutputStream()); out.print(param); out.flush(); in = conn.getInputStream(); result = readInputStream(charset, in); } catch (Exception e) { throw new RuntimeException(e); } finally { try { try { if (out != null) { out.close(); } } finally { if (in != null) { in.close(); } } } catch (Exception ex) { }
3.解析数据并解析,其中解析出集合有两种方式
方式一:
//用于接收远程发来的数据集合
List<Map<String, Object>> lists = new ArrayList<Map<String,Object>>();
//远程连接请求数据
String data = HttpUtils.get("http://192.168.1.112:8081/openapi/carChargeBLH_flightInfoManageSearch.do?flight_date=1", null);
// data = HttpUtils.post("http://192.168.1.112:8081/openapi/carChargeBLH_flightInfoManageSearch.do", "");
Gson gson = new Gson();
JsonParser parser = new JsonParser();
//json 转对象
JsonObject object=(JsonObject) parser.parse(data);
//根据发过来的数据格式 需要再转一次json
JsonObject object1 = (JsonObject) parser.parse(object.get("json").toString());
//获取json 对象的对象 里面的list集合
JsonArray array = object1.get("list").getAsJsonArray();
//循环json集合里面的数据并且放到lists里面
for (int i = 0; i < array.size(); i++) {
//获取一个subObject
JsonObject subObject = array.get(i).getAsJsonObject();
//获取属性
String id = subObject.get("id").toString();
String maintePerson = subObject.get("maintePerson").toString();
//保存属性
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
map.put("maintePerson", maintePerson);
//存到list
lists.add(map);
}
方式二:
//用于接收远程发来的数据集合
List<Map<String, Object>> lists = new ArrayList<Map<String,Object>>();
//远程连接请求数据
String data = HttpUtils.get("http://192.168.1.112:8081/openapi/carChargeBLH_flightInfoManageSearch.do?flight_date=1", null);
// data = HttpUtils.post("http://192.168.1.112:8081/openapi/carChargeBLH_flightInfoManageSearch.do", "");
Gson gson = new Gson();
JsonParser parser = new JsonParser();
//json 转对象
JsonObject object=(JsonObject) parser.parse(data);
//根据发过来的数据格式 需要再转一次json 看自己的数据格式,如果只嵌套一层是不用这一步的,如果嵌套多层 还需要多次转json
JsonObject object1 = (JsonObject) parser.parse(object.get("json").toString());
//获取json 对象的对象 里面的list集合
List<Map<String, Object>> list = gson.fromJson(object1.get("list").toString(),new TypeToken<List<Map<String, Object>>>() {}.getType());
请求之前的json数据:
转成list之后的数据: