HttpURLConnection
HttpURLConnection的用法
face++人脸检测api
HttpUrlConnection 基础使用
https://www.cnblogs.com/libertycode/p/5979260.html
一个支持HTTP特定功能的URLConnection。
使用这个类遵循以下模式:
- 请求对象:通过调用*URL.openConnection()*来获得一个新的HttpURLConnection对象,并且将其结果强制转换为HttpURLConnection;
- 准备请求:一个请求主要的参数是它的URI。请求头可能也包含元数据,例如证书,首选数据类型和会话cookies;
- 请求体:可以选择性的上传一个请求体。HttpURLConnection实例必须设置setDoOutput(true),如果它包含一个请求体。通过将数据写入一个由*getOutStream()*返回的输出流来传输数据;
- 读取响应:响应头通常包含元数据例如响应体的内容类型和长度,修改日期和会话cookies。响应体可以被由*getInputStream()*返回的输入流读取。如果响应没有响应体,则该方法会返回一个空的流;
- 关闭连接:一旦一个响应体已经被阅读后,HttpURLConnection 对象应该通过调用disconnect()关闭。断开连接会释放被一个connection占有的资源,这样它们就能被关闭或再次使用。
代码详解
private static byte[] post(String urlStr, HashMap<String, String> map, HashMap<String, byte[]> fileMap) throws Exception {
URL url = new URL(urlStr);//创建URL实例
HttpURLConnection con = (HttpURLConnection) url.openConnection();//获得HttpURLConnection对象
con.setDoOutput(true);//post请求,参数要放在http正文内,因此需要设为true
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setConnectTimeout(3000);
con.setReadTimeout(5000);
con.setRequestProperty("accept", "*/*");
//post请求,上传数据时的编码类型,并且指定了分隔符
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundaryString);
con.setRequestProperty("connection", "Keep-Alive");//设置与服务器保持连接
con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible;MSIE 6.0;Windows NT 5.1;SV1)");
//getOutStream会隐含的进行connect,所以也可以不调用connect
DataOutputStream obos = new DataOutputStream(con.getOutputStream());
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry) iter.next();
String key = entry.getKey();
String value = entry.getValue();
obos.writeBytes("--" + boundaryString + "\r\n");
obos.writeBytes("Content-Disposition: form-data; name=\"" + key + "\"\r\n");
obos.writeBytes("\r\n");
obos.writeBytes(value + "\r\n");
}
if (fileMap != null && fileMap.size() > 0) {
Iterator fileIter = fileMap.entrySet().iterator();
while (fileIter.hasNext()) {
Map.Entry<String, byte[]> fileEntry = (Map.Entry<String, byte[]>) fileIter.next();
obos.writeBytes("--" + boundaryString + "\r\n");
obos.writeBytes("Content-Disposition: form-data; name=\"" + fileEntry.getKey()
+ "\"; filename=\"" + encode(" ") + "\"\r\n");
obos.writeBytes("\r\n");
obos.write(fileEntry.getValue());
obos.writeBytes("\r\n");
}
}
obos.writeBytes("--" + boundaryString + "--" + "\r\n");
obos.writeBytes("\r\n");
obos.flush();
obos.close();
InputStream ins = null;
int code = con.getResponseCode();
try {
if (code == 200) {
ins = con.getInputStream();
} else {
ins = con.getErrorStream();
}
} catch (SSLException e) {
e.printStackTrace();
return new byte[0];
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff = new byte[4096];
int len;
while ((len = ins.read(buff)) != -1) {
baos.write(buff, 0, len);
}
byte[] bytes = baos.toByteArray();
ins.close();
return bytes;
}
注意:通过post上传数据时,若除了文本数据以外还要需要上传文件,则需要在指定每一条数据的Content-Disposition,name,若是文件还要指明filename,并在每条数据传输的后面用“–”加上boundary隔开,并且需要在第四行用“\r\n”换行符隔开,在最后一行也要用“–”加上boundary加上“–”隔开,否则会导致文件上传失败!