Java原生的API可用于发送HTTP请求
即java.net.URL、java.net.URLConnection,JDK自带的类;
1.通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)
2.设置请求的参数
3.发送请求
4.以输入流的形式获取返回内容
5.关闭输入流
- 封装请求类
1 package com.util; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.OutputStreamWriter; 9 import java.net.HttpURLConnection; 10 import java.net.MalformedURLException; 11 import java.net.URL; 12 import java.net.URLConnection; 13 import java.util.Iterator; 14 import java.util.Map; 15 16 public class HttpConnectionUtil { 17 18 // post请求 19 public static final String HTTP_POST = "POST"; 20 21 // get请求 22 public static final String HTTP_GET = "GET"; 23 24 // utf-8字符编码 25 public static final String CHARSET_UTF_8 = "utf-8"; 26 27 // HTTP内容类型。如果未指定ContentType,默认为TEXT/HTML 28 public static final String CONTENT_TYPE_TEXT_HTML = "text/xml"; 29 30 // HTTP内容类型。相当于form表单的形式,提交暑假 31 public static final String CONTENT_TYPE_FORM_URL = "application/x-www-form-urlencoded"; 32 33 // 请求超时时间 34 public static final int SEND_REQUEST_TIME_OUT = 50000; 35 36 // 将读超时时间 37 public static final int READ_TIME_OUT = 50000; 38 39 /** 40 * 41 * @param requestType 42 * 请求类型 43 * @param urlStr 44 * 请求地址 45 * @param body 46 * 请求发送内容 47 * @return 返回内容 48 */ 49 public static String requestMethod(String requestType, String urlStr, String body) { 50 51 // 是否有http正文提交 52 boolean isDoInput = false; 53 if (body != null && body.length() > 0) 54 isDoInput = true; 55 OutputStream outputStream = null; 56 OutputStreamWriter outputStreamWriter = null; 57 InputStream inputStream = null; 58 InputStreamReader inputStreamReader = null; 59 BufferedReader reader = null; 60 StringBuffer resultBuffer = new StringBuffer(); 61 String tempLine = null; 62 try { 63 // 统一资源 64 URL url = new URL(urlStr); 65 // 连接类的父类,抽象类 66 URLConnection urlConnection = url.openConnection(); 67 // http的连接类 68 HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection; 69 70 // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 71 // http正文内,因此需要设为true, 默认情况下是false; 72 if (isDoInput) { 73 httpURLConnection.setDoOutput(true); 74 httpURLConnection.setRequestProperty("Content-Length", String.valueOf(body.length())); 75 } 76 // 设置是否从httpUrlConnection读入,默认情况下是true; 77 httpURLConnection.setDoInput(true); 78 // 设置一个指定的超时值(以毫秒为单位) 79 httpURLConnection.setConnectTimeout(SEND_REQUEST_TIME_OUT); 80 // 将读超时设置为指定的超时,以毫秒为单位。 81 httpURLConnection.setReadTimeout(READ_TIME_OUT); 82 // Post 请求不能使用缓存 83 httpURLConnection.setUseCaches(false); 84 // 设置字符编码 85 httpURLConnection.setRequestProperty("Accept-Charset", CHARSET_UTF_8); 86 // 设置内容类型 87 httpURLConnection.setRequestProperty("Content-Type", CONTENT_TYPE_FORM_URL); 88 // 设定请求的方法,默认是GET 89 httpURLConnection.setRequestMethod(requestType); 90 91 // 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。 92 // 如果在已打开连接(此时 connected 字段的值为 true)的情况下调用 connect 方法,则忽略该调用。 93 httpURLConnection.connect(); 94 95 if (isDoInput) { 96 outputStream = httpURLConnection.getOutputStream(); 97 outputStreamWriter = new OutputStreamWriter(outputStream); 98 outputStreamWriter.write(body); 99 outputStreamWriter.flush();// 刷新 100 } 101 if (httpURLConnection.getResponseCode() >= 300) { 102 throw new Exception( 103 "HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode()); 104 } 105 106 if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 107 inputStream = httpURLConnection.getInputStream(); 108 inputStreamReader = new InputStreamReader(inputStream); 109 reader = new BufferedReader(inputStreamReader); 110 111 while ((tempLine = reader.readLine()) != null) { 112 resultBuffer.append(tempLine); 113 resultBuffer.append("\n"); 114 } 115 } 116 117 } catch (MalformedURLException e) { 118 // TODO Auto-generated catch block 119 e.printStackTrace(); 120 } catch (IOException e) { 121 // TODO Auto-generated catch block 122 e.printStackTrace(); 123 } catch (Exception e) { 124 // TODO Auto-generated catch block 125 e.printStackTrace(); 126 } finally {// 关闭流 127 128 try { 129 if (outputStreamWriter != null) { 130 outputStreamWriter.close(); 131 } 132 } catch (Exception e) { 133 // TODO Auto-generated catch block 134 e.printStackTrace(); 135 } 136 try { 137 if (outputStream != null) { 138 outputStream.close(); 139 } 140 } catch (Exception e) { 141 // TODO Auto-generated catch block 142 e.printStackTrace(); 143 } 144 try { 145 if (reader != null) { 146 reader.close(); 147 } 148 } catch (Exception e) { 149 // TODO Auto-generated catch block 150 e.printStackTrace(); 151 } 152 try { 153 if (inputStreamReader != null) { 154 inputStreamReader.close(); 155 } 156 } catch (Exception e) { 157 // TODO Auto-generated catch block 158 e.printStackTrace(); 159 } 160 try { 161 if (inputStream != null) { 162 inputStream.close(); 163 } 164 } catch (Exception e) { 165 // TODO Auto-generated catch block 166 e.printStackTrace(); 167 } 168 } 169 return resultBuffer.toString(); 170 } 171 172 /** 173 * 将map集合的键值对转化成:key1=value1&key2=value2 的形式 174 * 175 * @param parameterMap 176 * 需要转化的键值对集合 177 * @return 字符串 178 */ 179 public static String convertStringParamter(Map parameterMap) { 180 StringBuffer parameterBuffer = new StringBuffer(); 181 if (parameterMap != null) { 182 Iterator iterator = parameterMap.keySet().iterator(); 183 String key = null; 184 String value = null; 185 while (iterator.hasNext()) { 186 key = (String) iterator.next(); 187 if (parameterMap.get(key) != null) { 188 value = (String) parameterMap.get(key); 189 } else { 190 value = ""; 191 } 192 parameterBuffer.append(key).append("=").append(value); 193 if (iterator.hasNext()) { 194 parameterBuffer.append("&"); 195 } 196 } 197 } 198 return parameterBuffer.toString(); 199 } 200 201 public static void main(String[] args) throws MalformedURLException { 202 203 System.out.println(requestMethod(HTTP_GET, "http://127.0.0.1:8080/test/TestHttpRequestServlet", 204 "username=123&password=我是谁")); 205 206 } 207 }
- 测试Servlet
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class TestHttpRequestServelt extends HttpServlet { 11 12 13 @Override 14 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 16 System.out.println("this is a TestHttpRequestServlet"); 17 request.setCharacterEncoding("utf-8"); 18 19 String username = request.getParameter("username"); 20 String password = request.getParameter("password"); 21 22 System.out.println(username); 23 System.out.println(password); 24 25 response.setContentType("text/plain; charset=UTF-8"); 26 response.setCharacterEncoding("UTF-8"); 27 response.getWriter().write("This is ok!"); 28 29 } 30 }
- web.xml配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>test</display-name> 4 5 <servlet> 6 <servlet-name>TestHttpRequestServlet</servlet-name> 7 <servlet-class>com.servlet.TestHttpRequestServelt</servlet-class> 8 </servlet> 9 10 <servlet-mapping> 11 <servlet-name>TestHttpRequestServlet</servlet-name> 12 <url-pattern>/TestHttpRequestServlet</url-pattern> 13 </servlet-mapping> 14 15 <welcome-file-list> 16 <welcome-file>index.html</welcome-file> 17 <welcome-file>index.htm</welcome-file> 18 <welcome-file>index.jsp</welcome-file> 19 <welcome-file>default.html</welcome-file> 20 <welcome-file>default.htm</welcome-file> 21 <welcome-file>default.jsp</welcome-file> 22 </welcome-file-list> 23 </web-app>