通过http协议发送json格式请求并解析
本人初入门径。代码略显粗糙,欢迎指点改正!
最近在做公司的项目的时候,需要和其他公司进行业务上的对接,对方直接扔过来一个协议用来开发,最近稍微看了一下,写了一个通过协议获取数据的方法
对方的协议内容部分如下:


根据协议上的内容来看是可以通过http的方式来获取对应的业务数据的,但是发送的参数和返回的数据都是用的json格式,编码按照UTF-8的格式
因而写了以下一小段内容
private BackData getDataFromDH(String method,String param){
URL url=null;
//自定义实体类,我自定义的是和对方返回的json对应的类型
BackData data=null;
try {
//此处参数baseurl、method、param合成一个完整的url 如 http://192.168.29.200:8080/dahuaIS/rest/statistic/picrecord/参数
//这里的参数param在后文会特别说明
url=new URL("http://"+baseurl+method+param);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();//获取连接
//这里的set方法主要设置一些请求头的参数
connection.setRequestMethod("GET");//设置请求方式
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("authorization",authorization);//按照对方要求设置的相关认证内容
connection.connect();
Gson gson=new GsonBuilder().create();//这里使用到了google 的Gson.jar 可以方便地把对象和json格式互转
InputStream is = connection.getInputStream();
InputStreamReader r=new InputStreamReader(is,"utf-8");
BufferedReader br=new BufferedReader(r);
String s = br.readLine();//这里偷懒直接读了一个完整的字符串,因为返回的json实际上也是一个完整的行字符串
data = gson.fromJson(s, BackData.class);
//最后关闭流
br.close();
r.close();
is.close();
connection.disconnect();//断开连接
} catch (MalformedURLException e) { //以下异常具体情况具体处理
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
以上基本上就是获取数据并且转换成实体类的一个小流程
下面就是对实体类构建、param参数的说明
实体类:
对方给出的查询条件:
q={
"devChnId": "1000009@005$1$0$0",
"startDate": "2015-12-11 17:01:10",
"endDate ":"2015-12-12 17:01:10"
}
我构建的查询参数实体类如下:
public class SearchParam {
private String devChnId;
private String startDate;
private String endDate;
public String getDevChnId() {
return devChnId;
}
public void setDevChnId(String devChnId) {
this.devChnId = devChnId;
}
public String getStartDate() {
return startDate;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
@Override
public String toString() {
String str="";
try {
str=URLEncoder.encode("{\"devChnId\":\""+devChnId+"\",\"startDate\":\""+startDate+"\",\"endDate\":\""+endDate+"\"}", "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "q="+str;
}
}
上述实体类代码中toString方法的重写就是对param参数的一些特殊设置
在字符串中 “ 需要用\"转义,具体需要转义的符号可以查询<a href="http://blog.csdn.net/lanchengxiaoxiao/article/details/41893925">相关资料</a>
我这里的写法其实比较傻的,也可以说是比较原始的,之前提到的Gson可以把实体类构建成json格式的
用到Gson可以采用以下这种写法,Gson构建的类实际上输出就是一个String字符串
public String toString(){
return new GsonBuilder().create().toJson(this);
}
//以下是测试返回结果
{"devChnId":"#34523@34","startDate":"2011-12-15 12:23:43","endDate":"2016-12-12 12:02:24"}
但是这样只是获得了json格式的参数,在进行get方式进行请求的时候,直接这样的话会返回400错误,这是因为url参数中可能有一些识别不了的字符
所以需要使用URLEncoder.encode()进行url编码,但是前缀“q="不需要进行编码,以防识别不出是get方式的参数
最后对方返回的数据以json方式的话,同样用Gson的方法解析成对应的实体类或字符串即可
通过http协议发送json格式请求并解析的更多相关文章
- java请求POST发送json格式请求
public static String upload(String url){ try { HttpClient httpclient = new DefaultHttpClient(); Http ...
- 【PostMan】1、Postman 发送json格式请求
Postman 是一个用来测试Web API的Chrome 外挂软件,可由google store 免费取得并安装于Chrome里,对于有在开发Web API的开发者相当有用,省掉不少写测试页面呼叫的 ...
- Jmeter中使用HTTP信息头管理器发送json格式请求体的接口
Jmeter中,如果请求体的格式为x-www-form-urlencoded,则不需要添加请求头,保持默认即可,但是如果遇到接口的请求体格式为json时,就要用到HTTP信息头管理器,在线程组上右键— ...
- 利用 CURL 发送JSON格式字符串
/* * post 发送JSON 格式数据 * @param $url string URL * @param $data_string string 请求的具体内容 * @return array ...
- 如何使用python内置的request发送JSON格式的数据
使用步骤如下: 一.如果想发送json格式的数据,需要使用request模块中的Request类来创建对象,作为urlopen函数的参数 二.header中添加content-type为applica ...
- 巧妙的使用jmeter来发送json格式数据
1. header-manager 修改content-type值. 如果不修改该值, 则默认会是urlencode的数据格式(例如a=5&b=6). 修改为json后,会告诉服务器,发送的数 ...
- ajax发送json格式与文件数据、django自带的序列化器(了解)
上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...
- idHTTP 向网站发送json格式数据
idHTTP 向网站发送json格式数据 var rbody:tstringstream; begin rbody:=tstringstream.Create('{"name":& ...
- Jmeter在Http Rest接口中自动生成签名(Json格式请求参数)
第一步: 签名的java类生成jar包,导入到jmeter的lib目录下(依赖的第三方包也要导入) 第二步:编写jmeter脚本,这里使用BeanShell 进行签名串的生成,目录结构如下: Bean ...
随机推荐
- 【反演复习计划】【bzoj1011】zap-queries
快三个月没做反演题了吧…… 感觉高一上学期学的全忘了…… 所以还得从零开始学推式子. # bzoj1011 标签(空格分隔): 未分类 --- 原题意思是求以下式子:$Ans=\sum\limits_ ...
- 使用navicat修改Mysql默认密码
本质就是修改数据库mysql里面的数据表user一个字段,并执行如下一句mysql语句: UPDATE user SET password=PASSWORD('密码') WHERE user='roo ...
- 25,Spark Sort-Based Shuffle内幕彻底解密
一:为什么需要Sort-Based Shuffle? 1, Shuffle一般包含两个阶段任务: 第一部分:产生Shuffle数据的阶段(Map阶段,额外补充,需要实现ShuffleManager中 ...
- JS—正则表达式
正则表达式的元字符是包含特殊含义的字符,它们有一些特殊的功能,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含义. 单个字符和数字 .表示匹配除换行符外的单个字符,两个.就表示匹配两个字符 var ...
- keyPoints的相关函数
cout<<"坐标:"<<keypoints1[i].pt; cout<<",邻域直径:"<<keypoints ...
- 【NOIP2007】字符串展开解题报告
描述 Description 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用 ...
- bzoj4543[POI2014]Hotel
题目链接 bzoj4543 [POI2014]Hotel 题解 这不是裸地点分嘛 ,我真傻,真的 n^2 这不是是sb题,~滑稽 ~ 枚举点转换为无根树,暴力子树中点的深度 计数转移 令a b c d ...
- [CF819B]Mister B and PR Shifts
题意:定义一个排列$p_{1\cdots n}$的“偏移量”$D=\sum _{i=1}^n\left|p_i-i\right|$ 求它所有的轮换排列中偏移量最小的是多少,要求输出轮换序数 暴力就是求 ...
- 【树状数组】Codeforces Round #755 D. PolandBall and Polygon
http://codeforces.com/problemset/problem/755/D 每次新画一条对角线的时候,考虑其跨越了几条原有的对角线. 可以用树状数组区间修改点查询来维护多边形的顶点. ...
- 【动态规划】【记忆化搜索】CODEVS 1011 数的计算 2001年NOIP全国联赛普及组
设答案为f(n),我们显然可以暴力地递归求解: f(n)=f(1)+f(2)+……+f(n/2). 但是n=1000,显然会超时. 考虑状态最多可能会有n种,经过大量的重复计算,所以可以记忆下来,减少 ...