HttpURLConnection 模拟http请求形式(post)
前言
模拟https请求(Get、Post)
正文
一、Content-Type(内容类型)是什么?
MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息,是POST提交数据的方式。
1.Content-Type有以下类型:
1.1 (默认)application/x-www-form-urlencoded
为表单(Form)提交的形式,数据被编码为名称/值对。这是标准的编码格式。会将表单内的数据转换拼接成 key-value 对(非 ASCII 码进行编码)。
1.2 multipart/form-data
一般用于文件的上传,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
1.3 application/json
以JSON数据格式进行提交数据,许多人愿意以该种形式作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
1.4 text/xml
其是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范,一般很少使用该种模式,除非必要的情况。
可以查看连接文章→_→为什么要在WordPress中禁用XML-RPC?
请求格式如下(借鉴于→_→链接):
1.5 binary (application/octet-stream)
只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组)
二、不同Content-Type类型对应的相关代码
0.共用常量
/**
* BOUNDARY的分割线
*/
private static final String BOUNDARY = "367892878wjskd_file_2519775";
/**
* 请求方式为 POST
*/
private static final String POST_METHOD = "POST";
/**
* 编码:utf-8
*/
private static final String ENCODE_UTF_8 = "utf-8";
1.Content-Type:application/json
代码如下(示例):
/**
* 发送post请求
* @param reqUrl 请求url
* @param jsonStr 字符串
* @param tokenDto 相关配置信息
* @return
* @throws Exception
*/
public static String sendHttpForJSON(String reqUrl, String jsonStr,TokenDto tokenDto) throws Exception {
try {
URL url = new URL(reqUrl);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
/**
* 设置请求属性
*/
// 设置请求方式为 POST
httpConn.setRequestMethod(POST_METHOD);
// 设置请求数据格式,如 json 形式
httpConn.setRequestProperty("Content-Type", "application/json; utf-8");
// 设置接收数据格式,如 json 形式
httpConn.setRequestProperty("Accept", "application/json");
// 对于 post 请求,参数要放在 http 正文内,因此需要设为 true
httpConn.setDoOutput(true);
// 设置连接超时时间,单位为毫秒
httpConn.setConnectTimeout(tokenDto.getConnTimeOut());
// 设置读取超时时间,单位为毫秒
httpConn.setReadTimeout(tokenDto.getSocketTimeOut());
// 设置长连接,但是这个需要 http 1.1 协议及服务端支持才会真正生效
httpConn.setRequestProperty("Connection", "Keep-Alive");
/**
* 设置header头部信息
*/
if(null!=tokenRstDto && StringUtils.isNotBlank(tokenDto.getToken()) ) {
httpConn.setRequestProperty("client", "1");
httpConn.setRequestProperty("tenantId", tokenDto.getTenantId());
httpConn.setRequestProperty("token", tokenDto.getToken());
}
/**
* 设置 post 请求体参数
*/
if (jsonStr != null) {
OutputStream os = httpConn.getOutputStream();
byte[] input = jsonStr.getBytes(ENCODE_UTF_8);
os.write(input, 0, input.length);
os.flush();
os.close();
}
StringBuilder response = new StringBuilder();
String inputLine;
BufferedReader br = new BufferedReader(new InputStreamReader(