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

xiaoxiao2021-02-28  120

之前写过接口接收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形式的传输没有第三部分的处理

转载请注明原文地址: https://www.6miu.com/read-19841.html

最新回复(0)