目录(?)

前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求;

此处我封装了一个HTTP的get和post的辅助类,能够更好的使用;


类名:HttpRequestUtil

提供了如下功能:

(1)模拟GET请求;

(2)模拟POST请求;

(3)模拟文件上传请求;

(4)发送XML数据;


发送GET请求



(1)public static URLConnection sendGetRequest(String url,Map<String, String> params, Map<String, String> headers)

参数:

(1)url:单纯的URL,不带任何参数;

(2)params:参数;

(3)headers:需要设置的HTTP请求头;

返回:

HttpURLConnection


发送POST请求


(2)public static URLConnection sendPostRequest(String url,Map<String, String> params, Map<String, String> headers)

参数:

(1)url:单纯的URL,不带任何参数;

(2)params:参数;

(3)headers:需要设置的HTTP请求头;

返回:

HttpURLConnection


文件上传


(3)public static boolean uploadFiles(String url, Map<String, String> params, FormFile[] files)

参数:

(1)url:单纯URL

(2)params:参数;

(3)files:多个文件

返回:是否上传成功

(4)public static boolean uploadFile(String path, Map<String, String> params, FormFile file)

参数:

(1)url:单纯URL

(2)params:参数;

(3)file:一个文件

返回:是否上传成功


发送XML数据


(5)public static byte[] postXml(String url, String xml, String encoding)

参数:

(1)url:单纯URL

(2)xml:XML数据

(3)XML数据编码


对于上传文件,FormFile的构造函数声明如下:

(1)public FormFile(String filname, byte[] data, String parameterName, String contentType)

参数:

(1)filname:文件的名称

(2)data:文件的数据

(3)parameterName:HTML的文件上传控件的参数的名字

(4)contentType:文件类型,比如text/plain为txt

(2)public FormFile(String filname, File file, String parameterName, String contentType)

参数:

(1)filname:文件的名称

(2)file:文件名

(3)parameterName:HTML的文件上传控件的参数的名字

(4)contentType:文件类型,比如text/plain为txt



FormFile.java

前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求;此处我封装了一个HTTP的get和post的辅助类,能够更好的使用;类名:HttpRequestUtil提供了如下功能:(1)模拟GET请求;(2)模拟POST请求;(3)模拟文件上传请求;(4)发送XML数据;发送GET请求(1)public static URLConnection sendGetRequest(String url, Map<String, String> params, Map<String, String> headers)参数:(1)url:单纯的URL,不带任何参数;(2)params:参数;(3)headers:需要设置的HTTP请求头;返回:HttpURLConnection发送POST请求(2)public static URLConnection sendPostRequest(String url, Map<String, String> params, Map<String, String> headers)参数:(1)url:单纯的URL,不带任何参数;(2)params:参数;(3)headers:需要设置的HTTP请求头;返回:HttpURLConnection文件上传(3)public static boolean uploadFiles(String url, Map<String, String> params, FormFile[] files)参数:(1)url:单纯URL(2)params:参数;(3)files:多个文件返回:是否上传成功(4)public static boolean uploadFile(String path, Map<String, String> params, FormFile file)参数:(1)url:单纯URL(2)params:参数;(3)file:一个文件返回:是否上传成功发送XML数据(5)public static byte[] postXml(String url, String xml, String encoding)参数:(1)url:单纯URL(2)xml:XML数据(3)XML数据编码对于上传文件,FormFile的构造函数声明如下:(1)public FormFile(String filname, byte[] data, String parameterName, String contentType)参数:(1)filname:文件的名称(2)data:文件的数据(3)parameterName:HTML的文件上传控件的参数的名字(4)contentType:文件类型,比如text/plain为txt(2)public FormFile(String filname, File file, String parameterName, String contentType)参数:(1)filname:文件的名称(2)file:文件名(3)parameterName:HTML的文件上传控件的参数的名字(4)contentType:文件类型,比如text/plain为txtFormFile.java

HttpRequestUtil.java
package com.xiazdong.netword.http.util;  import java.io.BufferedReader;  import java.io.ByteArrayOutputStream;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java.io.InputStream;  import java.io.InputStreamReader;  import java.io.OutputStream;  import java.net.HttpURLConnection;  import java.net.InetAddress;  import java.net.Socket;  import java.net.URL;  import java.net.URLConnection;  import java.net.URLEncoder;  import java.util.HashMap;  import java.util.Map;  import java.util.Map.Entry;  import java.util.Set;    /*  * 此类用来发送HTTP请求  * */  public class HttpRequestUtil {      /**      * 发送GET请求      * @param url      * @param params      * @param headers      * @return      * @throws Exception      */      public static URLConnection sendGetRequest(String url,              Map<String, String> params, Map<String, String> headers)              throws Exception {          StringBuilder buf = new StringBuilder(url);          Set<Entry<String, String>> entrys = null;          // 如果是GET请求,则请求参数在URL中          if (params != null && !params.isEmpty()) {              buf.append("?");              entrys = params.entrySet();              for (Map.Entry<String, String> entry : entrys) {                  buf.append(entry.getKey()).append("=")                          .append(URLEncoder.encode(entry.getValue(), "UTF-8"))                          .append("&");              }              buf.deleteCharAt(buf.length() - 1);          }          URL url1 = new URL(buf.toString());          HttpURLConnection conn = (HttpURLConnection) url1.openConnection();          conn.setRequestMethod("GET");          // 设置请求头          if (headers != null && !headers.isEmpty()) {              entrys = headers.entrySet();              for (Map.Entry<String, String> entry : entrys) {                  conn.setRequestProperty(entry.getKey(), entry.getValue());              }          }          conn.getResponseCode();          return conn;      }      /**      * 发送POST请求      * @param url         * @param params      * @param headers      * @return       * @throws Exception      */      public static URLConnection sendPostRequest(String url,              Map<String, String> params, Map<String, String> headers)              throws Exception {          StringBuilder buf = new StringBuilder();          Set<Entry<String, String>> entrys = null;          // 如果存在参数,则放在HTTP请求体,形如name=aaa&age=10          if (params != null && !params.isEmpty()) {              entrys = params.entrySet();              for (Map.Entry<String, String> entry : entrys) {                  buf.append(entry.getKey()).append("=")                          .append(URLEncoder.encode(entry.getValue(), "UTF-8"))                          .append("&");              }              buf.deleteCharAt(buf.length() - 1);          }          URL url1 = new URL(url);          HttpURLConnection conn = (HttpURLConnection) url1.openConnection();          conn.setRequestMethod("POST");          conn.setDoOutput(true);          OutputStream out = conn.getOutputStream();          out.write(buf.toString().getBytes("UTF-8"));          if (headers != null && !headers.isEmpty()) {              entrys = headers.entrySet();              for (Map.Entry<String, String> entry : entrys) {                  conn.setRequestProperty(entry.getKey(), entry.getValue());              }          }          conn.getResponseCode(); // 为了发送成功          return conn;      }      /**      * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:      *   <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">             <INPUT TYPE="text" NAME="name">             <INPUT TYPE="text" NAME="id">             <input type="file" name="imagefile"/>             <input type="file" name="zip"/>          </FORM>      * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)      * @param params 请求参数 key为参数名,value为参数值      * @param file 上传文件      */      public static boolean uploadFiles(String path, Map<String, String> params, FormFile[] files) throws Exception{               final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线          final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志                    int fileDataLength = 0;          if(files!=null&&files.length!=0){              for(FormFile uploadFile : files){//得到文件类型数据的总长度                  StringBuilder fileExplain = new StringBuilder();                  fileExplain.append("--");                  fileExplain.append(BOUNDARY);                  fileExplain.append("\r\n");                  fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");                  fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");                  fileExplain.append("\r\n");                  fileDataLength += fileExplain.length();                  if(uploadFile.getInStream()!=null){                      fileDataLength += uploadFile.getFile().length();                  }else{                      fileDataLength += uploadFile.getData().length;                  }              }          }          StringBuilder textEntity = new StringBuilder();          if(params!=null&&!params.isEmpty()){              for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据                  textEntity.append("--");                  textEntity.append(BOUNDARY);                  textEntity.append("\r\n");                  textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");                  textEntity.append(entry.getValue());                  textEntity.append("\r\n");              }          }          //计算传输给服务器的实体数据总长度          int dataLength = textEntity.toString().getBytes().length + fileDataLength +  endline.getBytes().length;                    URL url = new URL(path);          int port = url.getPort()==-1 ? 80 : url.getPort();          Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);                  OutputStream outStream = socket.getOutputStream();          //下面完成HTTP请求头的发送          String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";          outStream.write(requestmethod.getBytes());          String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";          outStream.write(accept.getBytes());          String language = "Accept-Language: zh-CN\r\n";          outStream.write(language.getBytes());          String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";          outStream.write(contenttype.getBytes());          String contentlength = "Content-Length: "+ dataLength + "\r\n";          outStream.write(contentlength.getBytes());          String alive = "Connection: Keep-Alive\r\n";          outStream.write(alive.getBytes());          String host = "Host: "+ url.getHost() +":"+ port +"\r\n";          outStream.write(host.getBytes());          //写完HTTP请求头后根据HTTP协议再写一个回车换行          outStream.write("\r\n".getBytes());          //把所有文本类型的实体数据发送出来          outStream.write(textEntity.toString().getBytes());                   //把所有文件类型的实体数据发送出来          if(files!=null&&files.length!=0){              for(FormFile uploadFile : files){                  StringBuilder fileEntity = new StringBuilder();                  fileEntity.append("--");                  fileEntity.append(BOUNDARY);                  fileEntity.append("\r\n");                  fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");                  fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");                  outStream.write(fileEntity.toString().getBytes());                  if(uploadFile.getInStream()!=null){                      byte[] buffer = new byte[1024];                      int len = 0;                      while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){                          outStream.write(buffer, 0, len);                      }                      uploadFile.getInStream().close();                  }else{                      outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);                  }                  outStream.write("\r\n".getBytes());              }          }          //下面发送数据结束标志,表示数据已经结束          outStream.write(endline.getBytes());          BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));          if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败              return false;          }          outStream.flush();          outStream.close();          reader.close();          socket.close();          return true;      }      /**       * 提交数据到服务器       * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)       * @param params 请求参数 key为参数名,value为参数值       * @param file 上传文件       */      public static boolean uploadFile(String path, Map<String, String> params, FormFile file) throws Exception{         return uploadFiles(path, params, new FormFile[]{file});      }      /**      * 将输入流转为字节数组      * @param inStream      * @return      * @throws Exception      */      public static byte[] read2Byte(InputStream inStream)throws Exception{          ByteArrayOutputStream outSteam = new ByteArrayOutputStream();          byte[] buffer = new byte[1024];          int len = 0;          while( (len = inStream.read(buffer)) !=-1 ){              outSteam.write(buffer, 0, len);          }          outSteam.close();          inStream.close();          return outSteam.toByteArray();      }      /**      * 将输入流转为字符串      * @param inStream      * @return      * @throws Exception      */      public static String read2String(InputStream inStream)throws Exception{          ByteArrayOutputStream outSteam = new ByteArrayOutputStream();          byte[] buffer = new byte[1024];          int len = 0;          while( (len = inStream.read(buffer)) !=-1 ){              outSteam.write(buffer, 0, len);          }          outSteam.close();          inStream.close();          return new String(outSteam.toByteArray(),"UTF-8");      }      /**      * 发送xml数据      * @param path 请求地址      * @param xml xml数据      * @param encoding 编码      * @return      * @throws Exception      */      public static byte[] postXml(String path, String xml, String encoding) throws Exception{          byte[] data = xml.getBytes(encoding);          URL url = new URL(path);          HttpURLConnection conn = (HttpURLConnection)url.openConnection();          conn.setRequestMethod("POST");          conn.setDoOutput(true);          conn.setRequestProperty("Content-Type", "text/xml; charset="+ encoding);          conn.setRequestProperty("Content-Length", String.valueOf(data.length));          conn.setConnectTimeout(5 * 1000);          OutputStream outStream = conn.getOutputStream();          outStream.write(data);          outStream.flush();          outStream.close();          if(conn.getResponseCode()==200){              return read2Byte(conn.getInputStream());          }          return null;      }      //测试函数      public static void main(String args[]) throws Exception {          Map<String, String> params = new HashMap<String, String>();          params.put("name", "xiazdong");          params.put("age", "10");          HttpURLConnection conn = (HttpURLConnection) HttpRequestUtil                  .sendGetRequest(                          "http://192.168.0.103:8080/Server/PrintServlet",                          params, null);          int code = conn.getResponseCode();          InputStream in = conn.getInputStream();          byte[]data = read2Byte(in);      }  }  

测试代码:
Map<String,String> params = new HashMap<String,String>();  params.put("name", name.getText().toString());  params.put("age", age.getText().toString());  HttpURLConnection conn = (HttpURLConnection) HttpRequestUtil.sendGetRequest("http://192.168.0.103:8080/Server/PrintServlet", params, null);  

文件上传测试代码:
FormFile formFile = new FormFile(file.getName(), file, "document", "text/plain");  boolean isSuccess = HttpRequestUtil.uploadFile("http://192.168.0.103:8080/Server/FileServlet", null, formFile);  



更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android基于ViewPager实现类似微信页面切换效果
  4. android应用程序的数据存放目录
  5. 【Android(安卓)Developers Training】 83. 实现高效网络访问来
  6. 【Android每日一讲】2012.10.23 不同Activity之间的数据传递 --
  7. android Paint 渐变色
  8. ListView通过CursorAdapter显示数据库内容
  9. Android如何预置数据库或库文件

随机推荐

  1. go语言中自定义包的方法
  2. golang为什么那么火?
  3. Gin 中实现 HTTP Basic Auth
  4. go语言中的结构体与方法详解
  5. golang适合web开发吗?
  6. 详解 Go 中的不可变类型
  7. Golang 可以反编译吗?
  8. golang是否值得深入学习?
  9. GO语言中=和:=的区别介绍
  10. Go 语言中的 Context 详解