首页 > 编程 > Java > 正文

java利用java.net.URLConnection发送HTTP请求的方法详解

2019-11-26 12:13:49
字体:
来源:转载
供稿:网友

一、前言

如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求。

Java有原生的API可用于发送HTTP请求,即java.net.URLjava.net.URLConnection,这些API很好用、很常用,但不够简便;

所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient。

目前项目主要用到Java原生的方式,所以,这里主要介绍此方式。

二、运用原生Java Api发送简单的Get请求、Post请求步骤

       1.通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection

       2.设置请求的参数

       3.发送请求

       4.以输入流的形式获取返回内容

       5.关闭输入流

三、发送请求与接收响应流类 HttpRequestor

package me.http;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.InetSocketAddress;import java.net.Proxy;import java.net.URL;import java.net.URLConnection;import java.util.Iterator;import java.util.Map;public class HttpRequestor {  private String charset = "utf-8"; private Integer connectTimeout = null; private Integer socketTimeout = null; private String proxyHost = null; private Integer proxyPort = null;  /**  * Do GET request  * @param url  * @return  * @throws Exception  * @throws IOException  */ public String doGet(String url) throws Exception {    URL localURL = new URL(url);    URLConnection connection = this.openConnection(localURL);  HttpURLConnection httpURLConnection = (HttpURLConnection)connection;    httpURLConnection.setRequestProperty("Accept-Charset", charset);  httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");    InputStream inputStream = null;  InputStreamReader inputStreamReader = null;  BufferedReader reader = null;  StringBuffer resultBuffer = new StringBuffer();  String tempLine = null;  //响应失败  if (httpURLConnection.getResponseCode() >= 300) {   throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());  }    try {   inputStream = httpURLConnection.getInputStream();   inputStreamReader = new InputStreamReader(inputStream);   reader = new BufferedReader(inputStreamReader);      while ((tempLine = reader.readLine()) != null) {    resultBuffer.append(tempLine);   }     } finally {      if (reader != null) {    reader.close();   }      if (inputStreamReader != null) {    inputStreamReader.close();   }      if (inputStream != null) {    inputStream.close();   }     }  return resultBuffer.toString(); }  /**  * Do POST request  * @param url  * @param parameterMap  * @return  * @throws Exception   */ public String doPost(String url, Map parameterMap) throws Exception {    /* Translate parameter map to parameter date string */  StringBuffer parameterBuffer = new StringBuffer();  if (parameterMap != null) {   Iterator iterator = parameterMap.keySet().iterator();   String key = null;   String value = null;   while (iterator.hasNext()) {    key = (String)iterator.next();    if (parameterMap.get(key) != null) {     value = (String)parameterMap.get(key);    } else {     value = "";    }        parameterBuffer.append(key).append("=").append(value);    if (iterator.hasNext()) {     parameterBuffer.append("&");    }   }  }    System.out.println("POST parameter : " + parameterBuffer.toString());    URL localURL = new URL(url);    URLConnection connection = this.openConnection(localURL);  HttpURLConnection httpURLConnection = (HttpURLConnection)connection;    httpURLConnection.setDoOutput(true);  httpURLConnection.setRequestMethod("POST");  httpURLConnection.setRequestProperty("Accept-Charset", charset);  httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");  httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterBuffer.length()));    OutputStream outputStream = null;  OutputStreamWriter outputStreamWriter = null;  InputStream inputStream = null;  InputStreamReader inputStreamReader = null;  BufferedReader reader = null;  StringBuffer resultBuffer = new StringBuffer();  String tempLine = null;    try {   outputStream = httpURLConnection.getOutputStream();   outputStreamWriter = new OutputStreamWriter(outputStream);      outputStreamWriter.write(parameterBuffer.toString());   outputStreamWriter.flush();   //响应失败   if (httpURLConnection.getResponseCode() >= 300) {    throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());   }   //接收响应流   inputStream = httpURLConnection.getInputStream();   inputStreamReader = new InputStreamReader(inputStream);   reader = new BufferedReader(inputStreamReader);      while ((tempLine = reader.readLine()) != null) {    resultBuffer.append(tempLine);   }     } finally {      if (outputStreamWriter != null) {    outputStreamWriter.close();   }      if (outputStream != null) {    outputStream.close();   }      if (reader != null) {    reader.close();   }      if (inputStreamReader != null) {    inputStreamReader.close();   }      if (inputStream != null) {    inputStream.close();   }     }  return resultBuffer.toString(); } private URLConnection openConnection(URL localURL) throws IOException {  URLConnection connection;  if (proxyHost != null && proxyPort != null) {   Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));   connection = localURL.openConnection(proxy);  } else {   connection = localURL.openConnection();  }  return connection; }  /**  * Render request according setting  * @param request  */ private void renderRequest(URLConnection connection) {    if (connectTimeout != null) {   connection.setConnectTimeout(connectTimeout);  }    if (socketTimeout != null) {   connection.setReadTimeout(socketTimeout);  }   } /*  * Getter & Setter  */ public Integer getConnectTimeout() {  return connectTimeout; } public void setConnectTimeout(Integer connectTimeout) {  this.connectTimeout = connectTimeout; } public Integer getSocketTimeout() {  return socketTimeout; } public void setSocketTimeout(Integer socketTimeout) {  this.socketTimeout = socketTimeout; } public String getProxyHost() {  return proxyHost; } public void setProxyHost(String proxyHost) {  this.proxyHost = proxyHost; } public Integer getProxyPort() {  return proxyPort; } public void setProxyPort(Integer proxyPort) {  this.proxyPort = proxyPort; } public String getCharset() {  return charset; } public void setCharset(String charset) {  this.charset = charset; } }

四、为测试方便,新建一个项目,并新建一个Servlet,接收post请求并对HttpRequestor请求响应,发出响应流

LoginServlet.java代码:此处使用了

注解: @WebServlet("/LoginServlet") ,也可以在web.xml配置Servlet

package me.loginServlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class LoginServlet */@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L;   /**  * @see HttpServlet#HttpServlet()  */ public LoginServlet() {  super();  // TODO Auto-generated constructor stub } /**  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)  */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // TODO Auto-generated method stub  System.out.println("111"); } /**  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)  */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // TODO Auto-generated method stub   String username = request.getParameter("username");   String blog = request.getParameter("blog");      System.out.println(username);   System.out.println(blog);      response.setContentType("text/plain; charset=UTF-8");   response.setCharacterEncoding("UTF-8");//响应流   response.getWriter().write("It is ok!");   }}

五.测试类Test.java

package me.http;import java.util.HashMap;import java.util.Map;public class Test {public static void main(String[] args) {  /* Post Request */ Map dataMap = new HashMap(); dataMap.put("username", "Nick Huang"); dataMap.put("blog", "IT"); try {  System.out.println(new HttpRequestor().doPost("http://localhost:8081/TestProgect2/LoginServlet", dataMap));  //System.out.println(new HttpRequestor().doGet("http://localhost:8081/TestProgect2/LoginServlet")); } catch (Exception e) {  // TODO Auto-generated catch block  e.printStackTrace(); }  /* Get Request */ }}

1.接收post请求类LoginServlet,控制台测试结果

2.HttpRequestor接收LoginServlet返回的流

OK,完成

六.对于接收TestProgect2项目中LoginServlet.java类返回的流,在真实环境中可能是异步接收返回的流的,当一台机器A向另外一台机器B发送请求,B接收到A的信息,将信息处理后,需要将处理结果返回即响应返回给A,A会接收到B返回的信息

可以另外建一个Servlet类HttpListenerServlet.java来专门异步接收返回的信息

package me.http;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class HttpListenerServlet */@WebServlet("/HttpListenerServlet")public class HttpListenerServlet extends HttpServlet { private static final long serialVersionUID = 1L;   /**  * @see HttpServlet#HttpServlet()  */ public HttpListenerServlet() {  super();  // TODO Auto-generated constructor stub } /**  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)  */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // TODO Auto-generated method stub } /**  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)  */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // TODO Auto-generated method stub   InputStream inputStream = null;   inputStream = request.getInputStream();   InputStreamReader inputStreamReader = new InputStreamReader(inputStream);   BufferedReader reader = new BufferedReader(inputStreamReader);   String tempLine = null;   StringBuffer resultBuffer=new StringBuffer();   while ((tempLine = reader.readLine()) != null) {    resultBuffer.append(tempLine);   }      System.out.println(resultBuffer.toString()); }}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对武林网的支持。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表