HttpURLConnection的用法

HttpURLConnection的用法

face++人脸检测api

HttpUrlConnection 基础使用
https://www.cnblogs.com/libertycode/p/5979260.html

一个支持HTTP特定功能的URLConnection。
使用这个类遵循以下模式:

  1. 请求对象:通过调用*URL.openConnection()*来获得一个新的HttpURLConnection对象,并且将其结果强制转换为HttpURLConnection;
  2. 准备请求:一个请求主要的参数是它的URI。请求头可能也包含元数据,例如证书,首选数据类型和会话cookies;
  3. 请求体:可以选择性的上传一个请求体。HttpURLConnection实例必须设置setDoOutput(true),如果它包含一个请求体。通过将数据写入一个由*getOutStream()*返回的输出流来传输数据;
  4. 读取响应:响应头通常包含元数据例如响应体的内容类型和长度,修改日期和会话cookies。响应体可以被由*getInputStream()*返回的输入流读取。如果响应没有响应体,则该方法会返回一个空的流;
  5. 关闭连接:一旦一个响应体已经被阅读后,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加上“–”隔开,否则会导致文件上传失败!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值