美文网首页
HTTP网络通信工具

HTTP网络通信工具

作者: 小白狮子 | 来源:发表于2019-02-18 12:00 被阅读0次

    HttpUtil

    
    
    package com.xyy.utils;
    
    import java.io.ByteArrayOutputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    
    public class HttpUtil {
    
      /**
        * http请求的get方式
        *
        * @param http
        * @return
        */
      public static String get(String http) {
          String result = null;
          try {
            URL url = new URL(http);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            if (conn.getResponseCode() == 200) {
                // 获取服务器端返回内容的输入流
                InputStream in = conn.getInputStream();
                // 创建内容输出流(作用是临时存储内容然后转为byte数组)
                ByteArrayOutputStream dataOut = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int num;
                while ((num = in.read(buffer)) != -1) {
                  dataOut.write(buffer, 0, num);
                }
                dataOut.flush();
                result = new String(dataOut.toByteArray());
                dataOut.close();
                in.close();
            }
            conn.disconnect();
          } catch (Exception e) {
    
          }
          return result;
      }
    
      /**
        * http的post请求
        *
        * @param http 请求地址
        * @param map 请求参数列表
        * @return
        */
      public static String post(String http, Map<String, String> map) {
          String result = null;
          try {
            URL url = new URL(http);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setConnectTimeout(30000);
            // 设置请求方式为post
            conn.setRequestMethod("POST");
            conn.connect();
            if (map != null) {
                // 提交参数
                StringBuffer sb = new StringBuffer();
                Iterator<Entry<String, String>> it = map.entrySet().iterator();
                while (it.hasNext()) {
                  Entry<String, String> entry = it.next();
                  sb.append(entry.getKey()).append("=")
                        .append(entry.getValue()).append("&");
                }
                // 将最后一个&去掉
                sb.delete(sb.length() - 1, sb.length());
                String par = sb.toString();
                OutputStreamWriter out = new OutputStreamWriter(
                      conn.getOutputStream(), "UTF-8");
                out.write(par);
                out.flush();
                out.close();
            }
            // 判断是否连接成功
            if (conn.getResponseCode() == 200) {
                InputStream in = conn.getInputStream();
                ByteArrayOutputStream dataOut = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int num;
                while ((num = in.read(buffer)) != -1) {
                  dataOut.write(buffer, 0, num);
                }
                dataOut.flush();
                result = new String(dataOut.toByteArray());
                in.close();
                dataOut.close();
            }
            conn.disconnect();
          } catch (Exception e) {
    
          }
          return result;
      }
    
      public static String post(String actionUrl, Map<String, String> params,
                          Map<String, File> files) {
          return post(actionUrl, params, files, null);
      }
    
      // 上传代码,第一个参数,为要使用的URL,第二个参数,为表单内容,第三个参数为要上传的文件,可以上传多个文件
      public static String post(String actionUrl, Map<String, String> params,
                          Map<String, File> files, OnUploadListener l) {
          if (null == files) {
            return post(actionUrl, params);
          }
          String result = null;
          try {
            // 将内容以二进制流形式提交到服务器(需要服务器单独解析)
            String BOUNDARY = java.util.UUID.randomUUID().toString();
            String PREFIX = "--", LINEND = "\r\n";
            String MULTIPART_FROM_DATA = "multipart/form-data";
            String CHARSET = "UTF-8";
            URL uri = new URL(actionUrl);
            HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
            // 读取超时的设置
            conn.setReadTimeout(5 * 1000);
            conn.setDoInput(true);// 允许输入
            conn.setDoOutput(true);// 允许输出
            conn.setUseCaches(false);
            conn.setRequestMethod("POST"); // Post方式
            conn.setRequestProperty("connection", "keep-alive");
            conn.setRequestProperty("Charsert", "UTF-8");
            conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
                  + ";boundary=" + BOUNDARY);
            // 组装文本类型参数列表
            StringBuilder sb = new StringBuilder();
            if (null != params) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                  sb.append(PREFIX);
                  sb.append(BOUNDARY);
                  sb.append(LINEND);
                  // 传递文本参数的key部分
                  sb.append("Content-Disposition: form-data; name=\""
                        + entry.getKey() + "\"" + LINEND);
                  sb.append("Content-Type: text/plain; charset=" + CHARSET
                        + LINEND);
                  sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
                  sb.append(LINEND);
                  // 传递文本参数的value部分
                  sb.append(entry.getValue());
                  sb.append(LINEND);
                }
            }
            DataOutputStream outStream = new DataOutputStream(
                  conn.getOutputStream());
            outStream.write(sb.toString().getBytes());
            // 发送文件数据
            if (files != null) {
                int totalSize = 0;
                int currentSize = 0;
                for (Map.Entry<String, File> file : files.entrySet()) {
                  totalSize += file.getValue().length();
                }
                for (Map.Entry<String, File> file : files.entrySet()) {
                  StringBuilder sb1 = new StringBuilder();
                  sb1.append(PREFIX);
                  sb1.append(BOUNDARY);
                  sb1.append(LINEND);
                  sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""
                        + file.getKey() + "\"" + LINEND);
                  sb1.append("Content-Type: multipart/form-data; charset="
                        + CHARSET + LINEND);
                  sb1.append(LINEND);
                  outStream.write(sb1.toString().getBytes());
                  InputStream is = new FileInputStream(file.getValue());
                  byte[] buffer = new byte[1024];
                  int len = 0;
                  while ((len = is.read(buffer)) != -1) {
                      outStream.write(buffer, 0, len);
                      // 上传进度的计算
                      currentSize += len;
                      if (null != l) {
                        l.onProgress(currentSize, totalSize);
                      }
                  }
                  is.close();
                  outStream.write(LINEND.getBytes());
                }
            }
            // 请求结束标志
            byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
            outStream.write(end_data);
            outStream.flush();
            // 判断是否连接成功
            if (conn.getResponseCode() == 200) {
                InputStream in = conn.getInputStream();
                ByteArrayOutputStream dataOut = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int num;
                while ((num = in.read(buffer)) != -1) {
                  dataOut.write(buffer, 0, num);
                }
                dataOut.flush();
                result = new String(dataOut.toByteArray());
                in.close();
                dataOut.close();
            }
            conn.disconnect();
          } catch (Exception e) {
            e.printStackTrace();
          }
          return result;
      }
    
      public interface OnUploadListener {
          void onProgress(int current, int total);
      }
    
    }
    

    相关文章

      网友评论

          本文标题:HTTP网络通信工具

          本文链接:https://www.haomeiwen.com/subject/kfhaeqtx.html