java实现HTTP的post请求 key-value格式与json格式的区别

来源:互联网 发布:数字1一10的美工字体 编辑:程序博客网 时间:2024/06/14 11:40

之前写过接口接收json格式的post请求,当时自己写完以为可以适应各种报文的发送,最近对方说要有个”content=发送内容”,这不就是最简单的post请求吗,那直接用我之前写的http://blog.csdn.net/do_finsh/article/details/70237544发送方法加上“content=“不就可以了,结果对方说没有content,后来网上找的很多方法都可以成功,为什么我之前写的不行,之后改了行代码就可以了。先说明改了哪行代码,再探究一下为什么。

/**     * 向指定URL发送post方法的请求,字符串     * @param urlString 地址     * @param reqString 请求参数 name1=value1&name2=value2 的形式。     * @return String 返回内容     */public static String postString(String urlString ,String reqString) {            StringBuffer sb = new StringBuffer("");            try {                // 创建连接                URL url = new URL(urlString);                HttpURLConnection connection = (HttpURLConnection) url.openConnection();                connection.setRequestMethod("POST");                connection.setDoOutput(true);                connection.setDoInput(true);                connection.setUseCaches(false);                connection.setInstanceFollowRedirects(true);                //下边这行注释掉                           /***connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");***/              connection.connect();                DataOutputStream out = new DataOutputStream(                        connection.getOutputStream());                out.write(reqString.getBytes("UTF-8"));                out.flush();                out.close();                // 读取响应                BufferedReader reader = new BufferedReader(new InputStreamReader(                        connection.getInputStream(),"utf-8"));                String lines;                while ((lines = reader.readLine()) != null) {                    sb.append(lines);                }                reader.close();                // 断开连接                connection.disconnect();            } catch (MalformedURLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (UnsupportedEncodingException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            if (sb.toString().length()==0|sb.toString().trim().length()==0) {                return "";            }            return sb.toString();        }

只改变了一行代码,就相当于两种传输格式了。下面分析一下Content-Type不同的影响
application/json
application/json 用来告诉服务端消息主体是序列化后的 JSON 字符串。
JSON 格式支持比键值对复杂得多的结构化数据,但是如果在这种格式下用到key—value形式,接收方就接收不到value,因为本人小白,其实不懂这之间的本质,只能多测试几次,首先传输json格式的报文,传输之后解析成功,传输非json格式的报文的话,其实也可以接收到报文的整体内容,那么可能不是application/json 的影响,看下边这种格式,

application/x-www-form-urlencoded
常见的 POST 提交数据的方式。浏览器的原生 form 表单,如果不设置 enctype 属性,以及 ajax 提交数据那么最终就会以 application/x-www-form-urlencoded 方式提交数据。我们只看数据通过post请求接口提交数据,按照key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。例:
从别人那里拿了张图
第一部分 请求行,请求方法 post
第二部分 请求头部 Content-Type: application/x-www-form-urlencoded
Content-Length: 38
一个空行
第三部分 请求的数据 经过URLEncoder.encode的数据
区别就应该在第三部分的处理形式,application/json形式的传输没有第三部分的处理

原创粉丝点击