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