• 通过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的方法解析成对应的实体类或字符串即可

    Ink.Flower@china
  • 相关阅读:
    自动补全的java封装
    angular创建服务
    forEach和for包含异步调用的区别
    angular获取dom节点
    angular父组件给子组件传值
    angular环境
    SQL Server DBA 30问 【itpub】 天高地厚
    【转】任务管理器各参数说明 天高地厚
    开机引导 天高地厚
    测试发现数据库性能问题后的SQL调优 天高地厚
  • 原文地址:https://www.cnblogs.com/inkflower/p/6223543.html
Copyright © 2020-2023  润新知