這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)在java項(xiàng)目中使用java.net.URLConnection實(shí)現(xiàn)一個(gè)發(fā)送HTTP請(qǐng)求功能,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、渝水網(wǎng)站維護(hù)、網(wǎng)站推廣。
一、前言
如何通過(guò)Java發(fā)送HTTP請(qǐng)求,通俗點(diǎn)講,如何通過(guò)Java(模擬瀏覽器)發(fā)送HTTP請(qǐng)求。
Java有原生的API可用于發(fā)送HTTP請(qǐng)求,即java.net.URL
、java.net.URLConnection
,這些API很好用、很常用,但不夠簡(jiǎn)便;
所以,也流行有許多Java HTTP請(qǐng)求的framework,如,Apache的HttpClient。
目前項(xiàng)目主要用到Java原生的方式,所以,這里主要介紹此方式。
二、運(yùn)用原生Java Api發(fā)送簡(jiǎn)單的Get請(qǐng)求、Post請(qǐng)求步驟
1.通過(guò)統(tǒng)一資源定位器(java.net.URL
)獲取連接器(java.net.URLConnection
)
2.設(shè)置請(qǐng)求的參數(shù)
3.發(fā)送請(qǐng)求
4.以輸入流的形式獲取返回內(nèi)容
5.關(guān)閉輸入流
三、發(fā)送請(qǐng)求與接收響應(yīng)流類 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; //響應(yīng)失敗 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(); //響應(yīng)失敗 if (httpURLConnection.getResponseCode() >= 300) { throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode()); } //接收響應(yīng)流 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; } }
四、為測(cè)試方便,新建一個(gè)項(xiàng)目,并新建一個(gè)Servlet,接收post請(qǐng)求并對(duì)HttpRequestor請(qǐng)求響應(yīng),發(fā)出響應(yīng)流
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"); //響應(yīng)流 response.getWriter().write("It is ok!"); } }
五.測(cè)試類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請(qǐng)求類LoginServlet,控制臺(tái)測(cè)試結(jié)果
2.HttpRequestor接收LoginServlet返回的流
OK,完成
六.對(duì)于接收TestProgect2項(xiàng)目中LoginServlet.java類返回的流,在真實(shí)環(huán)境中可能是異步接收返回的流的,當(dāng)一臺(tái)機(jī)器A向另外一臺(tái)機(jī)器B發(fā)送請(qǐng)求,B接收到A的信息,將信息處理后,需要將處理結(jié)果返回即響應(yīng)返回給A,A會(huì)接收到B返回的信息
可以另外建一個(gè)Servlet類HttpListenerServlet.java來(lái)專門異步接收返回的信息
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()); } }
上述就是小編為大家分享的在java項(xiàng)目中使用java.net.URLConnection實(shí)現(xiàn)一個(gè)發(fā)送HTTP請(qǐng)求功能了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。