Http之HttpURLConnection-POST发送请求(multipartform-data)

it2024-12-17  14

Http之HttpURLConnection-POST发送文件请求

概述常见的Content-Type类型 POST请求POST请求(文件+参数)

概述

本文章只编写http使用HttpURLConnection发送post请求,包括两方面 1、普通post请求() 2、带有参数和文件的post请求

常见的Content-Type类型

1、application/x-www-form-urlencoded 最常见的 POST 提交数据的方式,原生Form表单,默认为application/x-www-form-urlencoded 方式提交数据。 2、multipart/form-data 它既可以上传键值对,也可以上传文件,甚至多个文件。当上传的字段是文件时,会有Content-Type来说明文件类型;Content-disposition,用来说明字段的一些信息。每部分都是以 –boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、文本或二进制等)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。

3、application/json 可使用序列化后的 JSON 字符串传输 4、text/xml XML的作用不言而喻,用于传输和存储数据,它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据

POST请求

类常量

/** * 链接超时时间 */ private static final int COUN_TIME_OUT = 10 * 1000; /** * 读取超时时间 */ private static final int READ_TIME_OUT = 30 * 1000; /** * 边界符 */ private static final String BOUNDARY = "******"; private static final String PRE_FIX = ("\r\n--" + BOUNDARY + "\r\n"); private static final String END_FIX = ("\r\n--" + BOUNDARY + "--\r\n");

请求方法

public static String sendPost(String url, String params) { String result = ""; DataOutputStream dataOutputStreamSend = null; InputStream inputStream = null; ByteArrayOutputStream dataOutputStream = null; try { URL httpUrl = new URL(url); HttpURLConnection urlConnection = (HttpURLConnection)httpUrl.openConnection(); // 设置超时时间 urlConnection.setConnectTimeout(COUN_TIME_OUT); urlConnection.setReadTimeout(READ_TIME_OUT); urlConnection.setRequestMethod("POST"); // 设置通用请求类型 urlConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); urlConnection.setRequestProperty("Charset", "UTF-8"); // 设置链接状态 urlConnection.setRequestProperty("connection", "keep-alive"); // post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false; urlConnection.setDoOutput(true); // 设置是否从httpUrlConnection读入,默认情况下是true; urlConnection.setDoInput(true); // Post 请求不能使用缓存 urlConnection.setUseCaches(false); // 设置本次连接是否自动处理重定向 urlConnection.setInstanceFollowRedirects(true); urlConnection.connect(); // ++++++++++++++++++++++++++++++++++ // TODO 写入参数 // +++++++++++++++++++++++++++++++ if (urlConnection.getResponseCode() == 200) { // 获取返回流 result = getResult(urlConnection.getInputStream()); } } catch (MalformedURLException e) { // url格式错误 e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭相应的流 } return result; }

getResult方法

private static String getResult(InputStream inputStream) { String result = ""; ByteArrayOutputStream dataOutputStream = null; try { byte[] buf = new byte[1024]; int n; dataOutputStream = new ByteArrayOutputStream(); while (((n = inputStream.read(buf)) != -1)) { dataOutputStream.write(buf, 0, n); } dataOutputStream.toByteArray(); result = new String(dataOutputStream.toByteArray(), "UTF-8"); } catch (IOException e) { e.printStackTrace(); } return result; }

TODO 写入参数

// 基本类型和字符串使用DataOutputStream dataOutputStreamSend = new DataOutputStream(urlConnection.getOutputStream()); dataOutputStreamSend.write(params.getBytes()); dataOutputStreamSend.flush();

POST请求(文件+参数)

请求方法 与普通POST请求差别 注意:boundary(分隔符),它是用来隔开提交的表单中不同部分的数据或者分割多个文件。在提交multipart/form-data请求时,设置Content_Type属性时,必须要同时指定所使用的boundary,否则上传过程中会报错,导致上传不成功。 boundary也可以自定义设置。

1、Content-Type不同

urlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

2、TODO 写入参数不同

outputStream = new DataOutputStream(urlConnection.getOutputStream()); // 获取上传文件 File file = new File(filePath); // 要上传的数据 StringBuffer strBuf = new StringBuffer(); // 标识payLoad + 文件流的起始位置 strBuf.append(PRE_FIX); // 这里的Content-Type的类型需与上传文件类型一致。 strBuf.append( "Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + ".jpg" + "\"\r\n"); strBuf.append("Content-Type: image/jpeg" + "\r\n\r\n"); outputStream.write(strBuf.toString().getBytes()); // 获取文件流 FileInputStream fileInputStream = new FileInputStream(file); inputStreamFile = new DataInputStream(fileInputStream); // 每次上传的大小 byte[] bufferOut = new byte[1024]; int b = -1; // 上传文件 while ((b = inputStreamFile.read(bufferOut)) != -1) { outputStream.write(bufferOut, 0, b); } // 参数间需换行 outputStream.write("\r\n".getBytes()); //第二部分参数:其他参数promoId,operator // TODO 动态参数需自行定义 当前只是一个参数 name StringBuilder contentBody = new StringBuilder(); contentBody.append(PRE_FIX); contentBody.append("Content-Disposition: form-data; name=\"name\"" + "\r\n"); contentBody.append("\r\n"); contentBody.append(params); // 第二个参数 contentBody.append(PRE_FIX); contentBody.append("Content-Disposition: form-data; name=\"age\"" + "\r\n"); contentBody.append("\r\n"); contentBody.append(params); outputStream.write(contentBody.toString().getBytes()); outputStream.write(END_FIX.getBytes()); outputStream.flush();
最新回复(0)