HttpPost 传输Json数据并解析
转自:https://blog.csdn.net/qq_35114086/article/details/52317311
这里写个测试用例模拟外部调用,通过httppost 传递一个json封装的表单数据。
包:import com.alibaba.fastjson.JSON;
       import com.alibaba.fastjson.JSONArray;
相关总结:http://xp9802.iteye.com/blog/2123450
每个json包都不一样,这里主要是fastjson包的用法。
@Test
public void synYxGoodsInfoTest() {
try {
String url = "http://10.118.44.14:8070/teshi-web/goods/synYxGoods";
GoodsInfo goodsInfo = new GoodsInfo();
goodsInfo.setGoods_id(111);
goodsInfo.setGoodsName("1231213");
goodsInfo.setBrand(1);
goodsInfo.setType(1);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
String jsonstr = JSON.toJSONString(goodsInfo);
StringEntity se = new StringEntity(jsonstr);
                        se.setContentType("text/json");
                       se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                       httpPost.setEntity(se);
                       HttpResponse response=httpClient.execute(httpPost);
//输出调用结果
if(response != null && response.getStatusLine().getStatusCode() == 200) {
String result=EntityUtils.toString(response.getEntity());
 
// 生成 JSON 对象
JSONObject obj = JSONObject.parseObject(result);
String errorcode = obj.getString("errorcode");
if("000".equals(errorcode)) {
System.out.println("addHkfishOrder_request_success");
}
}
 
} catch (Exception e) {
System.out.println("======回不来了=======" );
}
}
控制层接收数据
@RequestMapping(value = "/synYxGoods")
@ResponseBody
public String synYxGoods(HttpServletResponse response,HttpServletRequest request) throws IOException {
//String json = request.getParameter("param");  //这是通过通过get方式去url 拼接的键值对,post方式取不到值。
request.setCharacterEncoding("UTF-8");         //返回页面防止出现中文乱码
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));//post方式传递读取字符流
String jsonStr = null;
StringBuilder result = new StringBuilder();
try {
while ((jsonStr = reader.readLine()) != null) {
result.append(jsonStr);
}
} catch (IOException e) {
e.printStackTrace();
}
reader.close();// 关闭输入流
JSONObject jsonObject = JSONObject.parseObject(result.toString()); // 取一个json转换为对象
logger.info(jsonObject);
GoodsInfo goodsInfo = new GoodsInfo();
Date date = new Date();
goodsInfo.setAccess_code1("001");
                goodsInfo.setAccess_code1("001");
                goodsInfo.setGoodsName(jsonObject.getString("goodsName"));     //通过键取到值,再将值封装到类里面。
               goodsInfo.setType(Integer.parseInt(jsonObject.getString("type")));
List<ResultData<String>> data = yxGoodsService.synYxGoodsInfo(goodsInfo);
String json_str = JSON.toJSONString(data);
return write(response, json_str);
}
接收到的字符串:result.toString():{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}
JSONObject jsonObject = JSONObject.parseObject(result.toString()); 用pareseObject 直接转换为object类
这种方式对对方只传递一个类封装的json字符串,最实用。
测试2:用StringEntity 封装的json字符串传递一个list。
在输入端构造一个List,用list 添加几个对象,再转换为json 传过去,接收到的数据与测试1 的差距就是多了一个"[ ]"
goodsInfoList.add(goodsInfo1);
goodsInfoList.add(goodsInfo2);
goodsInfoList.add(goodsInfo3);
String jsonstr = JSON.toJSONString(list);
接收到的字符串:result.toString():[{"brand":1,"goodsName":"1231213","goods_id":111,"type":1},{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}]
List<GoodsInfo> list = JSON.parseArray(result.toString(), GoodsInfo.class);//可转换为list的对象。
测试3:用StringEntity 封装的json字符串传递一个由list封装的类中。
public class GoodsInfoRet {
private List<GoodsInfo> goodList;
private int total_record;
public List<GoodsInfo> getGoodList() {
return goodList;
}
public void setGoodList(List<GoodsInfo> goodList) {
this.goodList = goodList;
}
public int getTotal_record() {
return total_record;
}
public void setTotal_record(int total_record) {
this.total_record = total_record;
}
}
GoodsInfoRet good_dto = new GoodsInfoRet();
good_dto.setGoodList(goodsInfoList);
good_dto.setTotal_record(goodsInfoList.size());
JSONObject jsonObject = JSONObject.parseObject(result.toString());
jsonObject:    
  {"goodList":[{"brand":1,"goodsName":"1231213","goods_id":111,"type":1},
          
 {"brand":1,"goodsName":"1231213","goods_id":111,"type":1}],"total_record":2}
List<GoodsInfo> list = JSON.parseArray(jsonArray+"", GoodsInfo.class); //后面一定要跟上+,因为转换的是字符串才行
得到一个list的类,然后再遍历,在循环。
综上,用StringEntity se = new StringEntity(jsonstr); 是很有用的,能输出正确的代码格式,最后方便解析。
测试4:用List<NameValuePair> 封装的json字符串传递一个由list封装的类中。
String jsonstr = JSON.toJSONString(goodsInfo);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("param",jsonstr));
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response=new DefaultHttpClient().execute(httpPost);
接收到的字符串:result.toString() : param=%7B%22brand%22%3A1%2C%22goodsName%22%3A%221231213%22%2C%22goods_id%22%3A111%2C%22type%22%3A1%7D
这是url 编码,所以需要转码
URLDecoder.decode(result.toString(), "utf-8")
param={"brand":1,"goodsName":"1231213","goods_id":111,"type":1}
这时需要对字符串进行一个split的处理。
String s = URLDecoder.decode(result.toString(), "utf-8");
String[] s1 = s.split("=");
JSONObject object = JSON.parseObject(s1[1]);
这样就能得到一个已object 的对象
自行封装
goodsInfo.setGoodsName(jsonObject.getString("goodsName"));
封装的json字符串传递一个由list封装的list中。
String jsonstr = JSON.toJSONString(goodsInfoList);
转换的是一个list对象转换为json字符串,再放在 params 中,
那么接收到的字符串是:
URLDecoder.decode(result.toString(), "utf-8")
param=[{"brand":1,"goodsName":"1231213","goods_id":111,"type":1}]
这时需要对字符串进行一个split的处理。
String s = URLDecoder.decode(result.toString(), "utf-8");
String[] s1 = s.split("=");
这样就能得到一个已list的对象。
综上:传list封装的json要比类封装的json方便,用StringEntity要比List<NameValuePair> 要方便,前者不用再转码和切割字符串。
PHP与Java之间的交互。php只用拼接url就行了。
如:前端url
http://10.118.44.37:8070/teshi-web/supplier/synYxSupplier?supplierName=pl_test3%28%%29&supplierNo=60074&stName=%E4%81&stId=6
后端Java 接收
@RequestMapping(value="/totallist")
public String totallist(OrderQuery orderQuery, HttpServletResponse response) {
if(StringUtils.isEmpty(orderQuery.getOrder())) {
orderQuery.setOrder("desc");
}
return query(orderQuery, response);
// return "order/totallist";
}
只需要和接口人确认相关字段的键值,然后用spring自动封装,不用request 拿值,这样取得传过来的一个类是非常方便的是非常方便的。
但是不适用与传list对象。
HttpPost 传输Json数据并解析的更多相关文章
- Java:HttpPost 传输Json数据过长使用HttpServletRequest解析
		直接上代码 /** * 测试生成json数据 */ @Test public void synYxGoodsInfoTest() { try { String url = "http://1 ... 
- Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)
		一.HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ... 
- HttpURLConnection从网上获取Json数据并解析详解
		HttpURLConnection从网上获取Json数据并解析 1.HttpURLConnection请求数据的步骤 (1)构造一个URL接口地址: URL url = new URL("h ... 
- Django之AJAX传输JSON数据
		目录 Django之AJAX传输JSON数据 AJAX 中 JSON 数据传输: django响应JSON类型数据: django 响应 JSON 类型数据: Django之AJAX传输JSON数据 ... 
- Android 之 json数据的解析(jsonReader)
		json数据的解析相对而言,还是比较容易的,实现的代码也十分简单.这里用的是jsonReade方法来进行json数据解析. 1.在解析之前,大家需要知道什么是json数据. json数据存储的对象是无 ... 
- iOS开发网络篇—JSON数据的解析
		iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式 ... 
- 通过ajax和spring 后台传输json数据
		在通过ajax从页面向后台传数据的时候,总是返回415(Unsupported media type)错误,后台无法获取数据.如下图所示: 在尝试解决这个问题的时候,我们首先要理解一下概念: @req ... 
- javascript中 json数据的解析与序列化
		首先明确一下概念: json格式数据本质上就是字符串: js对象:JavaScript 中的几乎所有事务都是对象:字符串.数字.数组.日期.函数,等等. json数据的解析: 就是把后端传来的json ... 
- android基础---->JSON数据的解析
		上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ... 
随机推荐
- Selenium系列之--07 操作远程浏览器
			Selenium远程控制浏览,可以通过如下两种方式实现,本质上都是Selenium Grid a. 客户机启Selenium Standalone Server 作为远程服务,服务端通过调用Remo ... 
- 摘自《Linux与unix shell编程指南》
			shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ... 
- Java解析Property文件
			在Java项目中一些配置參数保存在Property文件里,这样能保证不改动原代码直接改动Property文件. PropertyParser.java package com.discover.par ... 
- WPF前台数据验证(红框)Validation.ErrorTemplate 附加属性
			WPF 显示验证错误的默认方式是在控件周围绘制红色边框.通常需要对此方法进行自定义,以通过其他方式来显示错误.而且,默认情况下不会显示与验证错误关联的错误消息.常见的要求是仅当存在验证错误时才在工具提 ... 
- NoSQL的四大类型
			1 键值数据库 相关产品:Redis.Riak.SimpleDB.Chordless.Scalaris.Memcached 应用:内容缓存 优点:扩展性好.灵活性好.大量写操作时性能高 缺点:无法存储 ... 
- Linux就该这么学--命令集合6(打包压缩文件、文件查询搜索命令)
			1.tar命令用于对文件打包压缩或解压:(tar [选项] [文件]) 打包并压缩文件:tar -czvf 压缩包名.tar.gz 文件名 解压并展开压缩包:tar -xzvf 压缩包名.tar.gz ... 
- 《打造Facebook》
			王淮的<打造Facebook>一书不厚,花半天时间轻松读完.书中没有大段的说教,只有近乎流水的陈述.正如作者所说,打造Facebook这本书由巴克伯格来写再合适不过.可惜他至少在近几年内没 ... 
- machine learning for hacker记录(2) 数据分析
			本章主要讲了对数据的一些基本探索,常见的six numbers,方差,均值等 > data.file <- file.path('data', '01_heights_weights_ge ... 
- Vue源码探究-状态初始化
			Vue源码探究-状态初始化 Vue源码探究-源码文件组织 Vue源码探究-虚拟DOM的渲染 本篇代码位于vue/src/core/instance/state.js 继续随着核心类的初始化展开探索其他 ... 
- Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路
			题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ... 
