java 用http远程请求另外一个服务器,并接收返回回来的json数据

需求场景:一个服务器的项目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之后的数据:


到此全部转换完成

猜你喜欢

转载自blog.csdn.net/buyaopingbixiazai/article/details/80680009