http发送header+body+json和返回
探究http协议发送header,发送body,发送json
探究htt协议接收header,接收body,解析json
(1)使用jar包
???????<dependency> ???????????<groupId>org.apache.httpcomponents</groupId> ???????????<artifactId>httpcore</artifactId> ???????????<version>4.4.9</version> ???????</dependency> ???????<dependency> ???????????<groupId>org.apache.httpcomponents</groupId> ???????????<artifactId>httpclient</artifactId> ???????????<version>4.5.5</version> ???????</dependency> ???????<dependency> ???????????<groupId>org.json</groupId> ???????????<artifactId>json</artifactId> ???????????<version>20180130</version> ???????</dependency> ???????<dependency> ???????????<groupId>com.jayway.jsonpath</groupId> ???????????<artifactId>json-path</artifactId> ???????</dependency>
(2)发送端
package com.his.vh.test;import java.util.HashMap;import java.util.Map;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.json.JSONObject;import org.junit.Test;/** *@file_name:TestHis.java *@description: * *@time:2018年5月21日 上午9:31:43 *@author:sf */public class TestRegister { ???????@Test ???public void register() throws Exception{ ???????????????????//封装发送参数 ????????Map<String, String> paras = new HashMap<String, String>(); ???????//—————————————————————————————————————————————————————— ????????paras.put("url", "http://127.0.0.1:8083/front/register"); ????????paras.put("username", "username_xiaoming"); ????????paras.put("password", "password_xiaoming"); ?????????????????String msg_package = "{\"package\": {" ???????????????????+"\"head\": {" ???????????????????+"\"busseID\": \"C210\"," ???????????????????+"\"sendTradeNum\": \"20190701083030-10011001-0001\"," ???????????????????+"\"senderCode\": \"0000\"," ???????????????????+"\"senderName\": \"医院\"," ???????????????????+"\"receiverCode\": \"0000\"," ???????????????????+"\"receiverName\": \"保险\"," ???????????????????+"\"intermediaryCode\": \"0000\"," ???????????????????+"\"intermediaryName\": \"ms\"," ???????????????????+"\"hosorgNum\": \"001\"," ???????????????????+"\"hosorgName\": \"张三\"," ???????????????????+"\"systemType\": \"1\"," ???????????????????+"\"busenissType\": \"2\"," ???????????????????+"\"standardVersionCode\": \"version:1.0.0\"," ???????????????????+"\"clientmacAddress \": \"30BB7E0A5E2D \"," ???????????????????+"\"recordCount \": \"1\"}," ???????????????????+"\"body\": [" ???????????????????+" {" ???????????????????+"\"medicalNum\": \"001\"," ???????????????????+"\"listCat\": \"张三\"," ???????????????????+"\"medicalItemCat\": \"1\"," ???????????????????+"\"recipeNum\": \"2\"" ???????????????????+"}" ???????????????????+"]," ???????????????????+"\"additionInfo\": {" ???????????????????+"\"errorCode\": \"123\"," ???????????????????+"\"errorMsg\": \"\"," ???????????????????+"\"receiverTradeNum\": \"\"," ???????????????????+"\"correlationId\": \"\"," ???????????????????+"\"asyncAsk\": \"0\"," ???????????????????+"\"callback\": \" http://127.0.0.1:8080/xxxx/xxxx.do\"," ???????????????????+"\"curDllAddr\": \"\"}}}"; ?????????????????paras.put("package", msg_package); ????????????????//—————————————————————————————————————————————————————— ???????????//创建客户端 ???????????HttpClient client = HttpClients.createDefault(); ???????????//建立连接 ???????????HttpPost post = new HttpPost(paras.get("url")); ???????????//设置Content-type ???????????post.addHeader("Content-type", "application/json; charset=utf-8"); ???????????????????????//从map中取出参数,放入header中 ???????????post.addHeader("header_1", paras.get("username")); ???????????post.addHeader("header_2", paras.get("password")); ???????????post.addHeader("header_3", paras.get("package")); ???????????????//设置body的接收类型 ???????????post.setHeader("Accept", "application/json"); ?????????????????????????????????????????JSONObject json = new JSONObject(); ???????????//body中封装数据 ???????????json.put("body_1", paras.get("username")); ???????????json.put("body_2", paras.get("password")); ???????????json.put("body_3", paras.get("package")); ???????????post.setEntity(new StringEntity(json.toString(),"UTF-8")); ???????????????????????//发送post请求 ???????????HttpResponse httpResponse = client.execute(post); ???????????????????????//HttpEntity用于接收【response.getWriter().print(内容)】中print的内容; ???????????HttpEntity entity = httpResponse.getEntity(); ???????????????????????//接收httpResponse的结果 ???????????Map<String, String> resultMap = new HashMap<String, String>(); ???????????//取出状态码 ???????????resultMap.put("status", httpResponse.getStatusLine().toString()); ???????????//取出print的值 ???????????resultMap.put("responseContent", EntityUtils.toString(entity));// ?????????resultMap.put("responseContent", EntityUtils.toString(entity,"UTF-8"));//解决乱码 ??????????????????????//获取所有返回的header ???????????System.out.println("\r\n==================== print return headers ==================== "); ???????????Header[] headers = httpResponse.getAllHeaders(); ???????????for (Header header : headers) { ???????????????System.out.println(header); ???????????} ???????????????????????????????//response 中获取 TOKEN ???????????if (httpResponse.containsHeader("TOKEN")) { ???????????????resultMap.put("TOKEN", httpResponse.getFirstHeader("token").toString()); ???????????} ???????????????????????//打印返回值的map ????????????System.out.println("\r\n==================== print return map ==================== "); ??????????for(String key:resultMap.keySet()){ ??????????????System.out.println("==========> "+ key +" : "+ resultMap.get(key)); ??????????} ???}}
(3)接收端
package com.hisfront.vh.controller;import java.io.BufferedReader;import java.io.IOException;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.configuration.Configuration;import org.json.JSONObject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import com.hisfront.vh.utils.AssistUtils;import com.hisfront.vh.utils.DcsHttpUtils;import com.hisfront.vh.utils.PropertiesUtils;import com.jayway.jsonpath.JsonPath;@Controller@RequestMapping(value = "/front")public class FrontController { ???private static Logger logger = LoggerFactory.getLogger(FrontController.class); ???Configuration config = PropertiesUtils.getConfiguration(); ???@Autowired ???private ServletContext servletContext; ???@RequestMapping("/callCloud") ???public void callCloud(HttpServletRequest request, HttpServletResponse response) { ???????System.out.println("----------------- ?打印headers -----------------"); ???????DcsHttpUtils.printHeaders(request); ???????Map<String, String> toCloudMap= new HashMap(); ???????//从header中取出报文 ???????//map.put("DATAGRAM",request.getHeader("DATAGRAM")); ???????//从servletContext中取出TOKEN ???????toCloudMap.put("TOKEN", request.getSession().getServletContext().getAttribute("TOKEN").toString()); ???????toCloudMap.put("url", config.getString("cloud.url.senddata")); ???????toCloudMap.put("user", request.getHeader("user")); ???????toCloudMap.put("password", request.getHeader("password")); ???????//从body中取出报文 ???????try { ???????????String bodyContent = DcsHttpUtils.getPostBodyContent(request); ???????????// JsonPath.read(bodyContent, "$.package"); ???????????System.out.println("\r\n\r\n"+bodyContent); ???????????//System.out.println("\r\n\r\n"+ JsonPath.read(bodyContent, "$.package")); ???????????toCloudMap.put("package", bodyContent); ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????logger.info("============> 获取post内容失败"); ???????} ???????System.out.println("----------------- ?打印map参数 -----------------"); ???????AssistUtils.printMap(toCloudMap); ???????System.out.println("---------------- ?返回响应数据给his ?-----------------"); ???????try { ???????????response.setHeader("TOKEN", "front_token"); ???????????response.getWriter().println("22222222"); ???????} catch (IOException e) { ???????????e.printStackTrace(); ???????????logger.info("返回响应数据"); ???????} ???????System.out.println("---------------- ?模拟请求cloud ?-----------------"); ???????Map<String, String> resultMap = null; ???????try { ???????????resultMap = DcsHttpUtils.submitPost(toCloudMap); ???????????System.out.println("==================AssistUtils.printMap(resultMap);===================\r\n\r\n"); ???????????AssistUtils.printMap(resultMap); ???????????String responseContent = resultMap.get("responseContent"); ???????????System.out.println(responseContent); ???????????System.out.println("sendTradeNum =======> " + JsonPath.read(responseContent, "$.package.head.sendTradeNum")); ???????????System.out.println("medicalNum =======> " + JsonPath.read(responseContent, "$.package.body[0].medicalNum")); ???????????String errorCode = JsonPath.read(responseContent, "$.package.additionInfo.errorCode"); ???????????//errorCode 为 0 正常,说明发送成功 ???????????if ("0" == errorCode) { ???????????????logger.info("---------------- requestCloud and sendData successfully ---------------------"); ???????????} else if ("0001" == errorCode) { //token 过期,重新注册 ???????????????logger.info("---------------- token fired , reregister again ---------------------"); ???????????????toCloudMap.put("url", config.getString("cloud.url.register")); ???????????????//重新注册 ???????????????Map<String, String> registerResultMap = DcsHttpUtils.submitPost(toCloudMap); ???????????????logger.info("---------------- reregister successfully ---------------------"); ???????????????logger.info("----------------registerResultMap---------------------"); ???????????????AssistUtils.printMap(registerResultMap); ???????????????//TOKEN 放 servletContext ???????????????servletContext.setAttribute("TOKEN", registerResultMap.get("TOKEN")); ???????????????toCloudMap.put("TOKEN", registerResultMap.get("TOKEN")); ???????????????toCloudMap.put("url", config.getString("cloud.url.senddata")); ???????????????Map<String, String> sendDataResultMap = DcsHttpUtils.submitPost(toCloudMap); ???????????????logger.info("---------------- requestCloud and sendData successfully ---------------------"); ???????????????System.out.println("errorCode =======> " + errorCode); ???????????????System.out.println("sendTradeNum =======> " + JsonPath.read(responseContent, "$.package.head.sendTradeNum")); ???????????????System.out.println("medicalNum =======> " + JsonPath.read(responseContent, "$.package.body[0].medicalNum")); ???????????????logger.info("---------------sendDataResultMap--------------------"); ???????????????AssistUtils.printMap(sendDataResultMap); ???????????} ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????logger.info("directCPST 请求 cloud 失败。。。"); ???????} ???????System.out.println(request.getSession().getServletContext().getAttribute("TOKEN")); ???} ???//http://localhost:8081/front/callHis ???///////////////////////////////////////////////////////////////////////////////////////////////// ???@RequestMapping("/callHis") ???public void callHis(HttpServletRequest request, HttpServletResponse response) { ???????System.out.println("----------------- ?打印headers -----------------"); ???????DcsHttpUtils.printHeaders(request); ???????Map<String, String> mapToHis = new HashMap(); ???????mapToHis.put("url", config.getString("hosp.url")); ???????System.out.println(config.getString("hosp.url")); ???????mapToHis.put("user", request.getHeader("user")); ???????mapToHis.put("password", request.getHeader("password")); ???????System.out.println("----------------- ?打印map参数 -----------------"); ???????AssistUtils.printMap(mapToHis); ???????System.out.println("---------------- ?模拟请求 his ?-----------------"); ???????try { ??????????// response.setCharacterEncoding("UTF-8"); ???????????Map<String, String> mapFromHis = DcsHttpUtils.submitPost(mapToHis); ???????????System.out.println("---------------- ??AssistUtils.printMap(mapFromHis); ?-----------------"); ???????????AssistUtils.printMap(mapFromHis); ???????????System.out.println("---------------- ??AssistUtils.printMap(mapToCloud); ?-----------------"); ???????????Map<String ,String > mapToCloud = new HashMap<>(); ???????????mapToCloud.put("package",mapFromHis.get("responseContent")); ???????????mapToCloud.put("url",config.getString("cloud.url.senddata")); ???????????AssistUtils.printMap(mapToCloud); ???????????System.out.println("---------------- ?结果返给 cloud ?-----------------"); ???????????try { ???????????????response.setCharacterEncoding("UTF-8"); ???????????????response.getWriter().print(mapFromHis.get("responseContent")); ?????????????// ?DcsHttpUtils.submitPost(mapToCloud); ???????????????System.out.println("-------------- ?结果返给 cloud successfully -------------------------"); ???????????} catch (Exception e) { ???????????????logger.info(" fastCPST 请求 cloud 失败。。。"); ???????????} ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????logger.info("fastCPST 请求 his 。。。"); ???????} ???} ???@RequestMapping(value="/register") ???public void register(HttpServletRequest request, HttpServletResponse response) throws Exception{ ???????????????System.out.println("\r\n==================== print request header ==================== "); ???????//打印header 可封装成方法 ????????Enumeration headerNames = request.getHeaderNames(); ????????while (headerNames.hasMoreElements()) { ????????????String key = (String) headerNames.nextElement(); ????????????String value = request.getHeader(key); ????????????System.out.println("===> " + key + " --- " + value); ????????} ????????????????//获取body ????????try { ????????????????????????// 获取bodyContent,可封装成方法----start ???????????request.setCharacterEncoding("UTF-8"); ????????????????StringBuffer sb = new StringBuffer(); ????????????BufferedReader read = request.getReader(); ????????????String str; ????????????while ((str = read.readLine()) != null) { ????????????????sb.append(str + "\n"); ????????????} ????????????read.close(); ????????????String bodyContent =sb.toString(); ????????????System.out.println("\r\n==================== print request body ==================== "); ????????????System.out.println(bodyContent); ?????????// 获取bodyContent,可封装成方法----end ?????????????????System.out.println("\r\n==================== print request body ==================== "); ????????//从bodyContent中获取json串的参数 ????????JSONObject jo = new JSONObject(bodyContent); ????????System.out.println("body_1 ============> "+ jo.get("body_1")); ????????System.out.println("body_2 ============> "+ jo.get("body_2")); ????????System.out.println("body_3 ============> "+ jo.get("body_3")); ?????????????????????????????//使用JsonPath,获取json的value ?????????????????System.out.println("\r\n==================== print request body package==================== "); ????????String responseContent = (String) jo.get("body_3"); ???????????System.out.println("sendTradeNum =======> " + JsonPath.read(responseContent, "$.package.head.sendTradeNum")); ????????System.out.println("medicalNum =======> " + JsonPath.read(responseContent, "$.package.body[0].medicalNum")); ????????System.out.println("errorCode =======> " +JsonPath.read(responseContent, "$.package.additionInfo.errorCode")); ????????????????} catch (Exception e) { ???????????e.printStackTrace(); ???????} ????????//获取header中的值 ???????String username = request.getHeader("header_1"); ???????String password = request.getHeader("header_2"); ???????????????????????//加密产生token ???????//String token = Base64Encrypt.Encode(username+password);//使用相应的加密方法生成token ???????String token = username+"_"+password;//这里直接用 username_password 作为token ???????????????//把token放入session ???????request.getSession().setAttribute("token", token); ???????????????//设置response的header ???????response.setHeader("token", "return_token --> "+token); ???????response.setHeader("header_1", "return_token --> header_1 "); ???????response.setHeader("header_2", "return_token --> header_2"); ???????????????response.setCharacterEncoding("UTF-8"); ???????try { ???????????//把token写到 StringEntity 中,返回给请求对象 ???????????response.getWriter().print(token); ???????} catch (IOException e) { ???????????e.printStackTrace(); ???????} ???????????????????}}
(4)发送端console
==================== print return headers ==================== Set-Cookie: JSESSIONID=22340FC21A26A7E2B062AB718309E716; Path=/; HttpOnlytoken: return_token --> username_xiaoming_password_xiaomingheader_1: return_token --> header_1 header_2: return_token --> header_2Content-Length: 35Date: Mon, 21 May 2018 09:45:17 GMT==================== print return map ==================== ==========> TOKEN : token: return_token --> username_xiaoming_password_xiaoming==========> responseContent : username_xiaoming_password_xiaoming==========> status : HTTP/1.1 200
(5)接收端console
==================== print request header ==================== ===> content-type --- application/json; charset=utf-8===> header_1 --- username_xiaoming===> header_2 --- password_xiaoming===> header_3 --- {"package": {"head": {"busseID": "C210","sendTradeNum": "20190701083030-10011001-0001","senderCode": "0000","senderName": ";b","receiverCode": "0000","receiverName": "Yi","intermediaryCode": "0000","intermediaryName": "ms","hosorgNum": "001","hosorgName": " ????","systemType": "1","busenissType": "2","standardVersionCode": "version:1.0.0","clientmacAddress ": "30BB7E0A5E2D ","recordCount ": "1"},"body": [ {"medicalNum": "001","listCat": " ???","medicalItemCat": "1","recipeNum": "2"}],"additionInfo": {"errorCode": "123","errorMsg": "","receiverTradeNum": "","correlationId": "","asyncAsk": "0","callback": " http://127.0.0.1:8080/xxxx/xxxx.do","curDllAddr": ""}}}===> accept --- application/json===> content-length --- 866===> host --- 127.0.0.1:8083===> connection --- Keep-Alive===> user-agent --- Apache-HttpClient/4.5.5 (Java/1.8.0_131)===> accept-encoding --- gzip,deflate==================== print request body ==================== {"body_3":"{\"package\": {\"head\": {\"busseID\": \"C210\",\"sendTradeNum\": \"20190701083030-10011001-0001\",\"senderCode\": \"0000\",\"senderName\": \"医院\",\"receiverCode\": \"0000\",\"receiverName\": \"保险\",\"intermediaryCode\": \"0000\",\"intermediaryName\": \"ms\",\"hosorgNum\": \"001\",\"hosorgName\": \"张三\",\"systemType\": \"1\",\"busenissType\": \"2\",\"standardVersionCode\": \"version:1.0.0\",\"clientmacAddress \": \"30BB7E0A5E2D \",\"recordCount \": \"1\"},\"body\": [ {\"medicalNum\": \"001\",\"listCat\": \"张三\",\"medicalItemCat\": \"1\",\"recipeNum\": \"2\"}],\"additionInfo\": {\"errorCode\": \"123\",\"errorMsg\": \"\",\"receiverTradeNum\": \"\",\"correlationId\": \"\",\"asyncAsk\": \"0\",\"callback\": \" http:\/\/127.0.0.1:8080\/xxxx\/xxxx.do\",\"curDllAddr\": \"\"}}}","body_1":"username_xiaoming","body_2":"password_xiaoming"}==================== print request body ==================== body_1 ============> username_xiaomingbody_2 ============> password_xiaomingbody_3 ============> {"package": {"head": {"busseID": "C210","sendTradeNum": "20190701083030-10011001-0001","senderCode": "0000","senderName": "医院","receiverCode": "0000","receiverName": "保险","intermediaryCode": "0000","intermediaryName": "ms","hosorgNum": "001","hosorgName": "张三","systemType": "1","busenissType": "2","standardVersionCode": "version:1.0.0","clientmacAddress ": "30BB7E0A5E2D ","recordCount ": "1"},"body": [ {"medicalNum": "001","listCat": "张三","medicalItemCat": "1","recipeNum": "2"}],"additionInfo": {"errorCode": "123","errorMsg": "","receiverTradeNum": "","correlationId": "","asyncAsk": "0","callback": " http://127.0.0.1:8080/xxxx/xxxx.do","curDllAddr": ""}}}==================== print request body package==================== sendTradeNum =======> 20190701083030-10011001-0001medicalNum =======> 001errorCode =======> 123
http协议发送header+body+json及接收解析
原文地址:https://www.cnblogs.com/vmkash/p/9068528.html