HttpURLConnection 模拟http请求形式(post)

本文介绍了HttpURLConnection如何模拟HTTP POST请求,并详细讲解了Content-Type的不同类型,包括application/x-www-form-urlencoded、multipart/form-data、application/json、text/xml和binary(application/octet-stream),并提供了相关代码示例。
摘要由CSDN通过智能技术生成


前言

模拟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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值