一.
1、寫一個HttpRequestUtils工具類,包括post請求和get請求
package com.brainlong.framework.util.httpclient; import net.sf.json.JSONObject;import org.apache.commons.httpclient.HttpStatus;import org.apache.http.HttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.io.IOException;import java.net.URLDecoder; public class HttpRequestUtils { private static Logger logger = LoggerFactory.getLogger(HttpRequestUtils.class); //日誌記錄/** * httpPost * @param url 路徑* @param jsonParam 參數* @return */ public static JSONObject httpPost(String url,JSONObject jsonParam){ return httpPost(url, jsonParam, false); } /** * post請求* @param url url地址* @param jsonParam 參數* @param noNeedResponse 不需要返回結果* @return */ public static JSONObject httpPost(String url,JSONObject jsonParam, boolean noNeedResponse){ //post請求返回結果DefaultHttpClient httpClient = new DefaultHttpClient(); JSONObject jsonResult = null; HttpPost method = new HttpPost(url); try { if (null != jsonParam) { //解決中文亂碼問題StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8"); entity.setContentEncoding("UTF-8"); entity.setContentType("application/json"); method.setEntity(entity); } HttpResponse result = httpClient.execute(method); url = URLDecoder.decode(url, "UTF-8"); /**請求發送成功,並得到響應**/ if (result.getStatusLine().getStatusCode() == 200) { String str = ""; try { /**讀取服務器返回過來的json字符串數據**/ str = EntityUtils.toString(result.getEntity()); if (noNeedResponse) { return null; } /**把json字符串轉換成json對象**/ jsonResult = JSONObject.fromObject(str); } catch (Exception e) { logger.error("post請求提交失敗:" + url, e); } } } catch (IOException e) { logger.error("post請求提交失敗:" + url, e); } return jsonResult; } /** * 發送get請求* @param url 路徑* @return */ public static JSONObject httpGet(String url){ //get請求返回結果JSONObject jsonResult = null; try { DefaultHttpClient client = new DefaultHttpClient(); //發送get請求HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); /**請求發送成功,並得到響應**/ if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { /**讀取服務器返回過來的json字符串數據**/ String strResult = EntityUtils.toString(response.getEntity()); /**把json字符串轉換成json對象**/ jsonResult = JSONObject.fromObject(strResult); url = URLDecoder.decode(url, "UTF-8"); } else { logger.error("get請求提交失敗:" + url); } } catch (IOException e) { logger.error("get請求提交失敗:" + url, e); } return jsonResult; }}2、寫業務代碼發送Http請求
3、MVC配置文件設置Controller掃描目錄
<!-- 自動掃描且只掃描@Controller --><context:component-scan base-package="com.wiselong.multichannel" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan>
4、接收Http請求
接收post請求
@Controller@RequestMapping(value="/api/platform/exceptioncenter/exceptioninfo")publicclassExceptionInfoController{//注入@AutowiredprivateExceptionInfoBizexceptionInfoBiz;/***創建異常信息請求*@paramrequestBody請求消息內容*@paramrequest請求消息頭*@returnjsonObject*/@RequestMapping(value="/create",method=RequestMethod.POST)publicModelAndViewcreateExceptionInfo(@RequestBodyStringrequestBody,HttpServletRequestrequest){JSONObjectjsonObject=JSONObject.fromObject(requestBody);ComExceptionInfocomExceptionInfo=newComExceptionInfo();comExceptionInfo.setProjectName(jsonObject.getString("projectName"));comExceptionInfo.setTagName(jsonObject.getString("tagName"));exceptionInfoBiz.insert(comExceptionInfo);//返回請求結果JSONObjectresult=newJSONObject();result.put("success","true");returnnewModelAndView("",ResponseUtilsHelper.jsonSuccess(result.toString()));}}接收get請求
@Controller@RequestMapping(value="/api/platform/messagecenter/messages/sms")publicclassSmsController{@AutowiredSmsSendBizsmsSendBiz;/***接收手機號碼和內容往短信發送表插入一條記錄*@paramrequestbody請求消息內容*@paramrequest請求消息頭*@returnjsonObject*/@RequestMapping(value="/send",method=RequestMethod.GET)publicModelAndViewsendSms(@RequestBodyStringrequestbody,HttpServletRequestrequest){//獲取請求URL及url後面傳輸的參數Stringurl=request.getRequestURL()+"?"+request.getQueryString();url=BuildRequestUrl.decodeUrl(url);StringtelePhone=RequestUtils.getStringValue(request,"telePhone");Stringcontent=RequestUtils.getStringValue(request,"content");smsSendBiz.insertTtMsQuequ(telePhone,content);returnnewModelAndView("",ResponseUtilsHelper.jsonResult("",true));}}二.
get
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importorg.apache.commons.httpclient.HttpClient;importorg.apache.commons.httpclient.HttpMethod;importorg.apache.commons.httpclient.methods.GetMethod;publicclassH_client_get{publicstaticvoidmain(String[]args)throwsIOException{//new類對象HttpClientclient=newHttpClient();//使用GET方法與URL服務器進行交互//HttpMethodmethod=newGetMethod("http://192.168.111.128/bak/[email protected]&password=1234567&re_password=1234567&username=admin&nickname=管理員");HttpMethodmethod=newGetMethod("http://192.168.111.128/bak/login.php?username=");//使用GET方法,實行與url服務器連接client.executeMethod(method);//數據流輸出//method.getResponseBodyAsStream創建字節流對象為inputStreamInputStreaminputStream=method.getResponseBodyAsStream();//InputStreamReader(inputStream)字節流轉換成字符流BufferedReader封裝成帶有緩衝的字符流對象了BufferedReaderbr=newBufferedReader(newInputStreamReader(inputStream,"UTF-8"));//StringBuffer是字符串變量,它的對像是可以擴充和修改的創建一個空的StringBuffer類的對象StringBufferstringBuffer=newStringBuffer();//定義字符串常量Stringstr="";//br字符流賦值給str字符串常量str不等於空按行輸出while((str=br.readLine())!=null){//StringBuffer是字符串變量,它的對像是可以擴充和修改的將str數據賦予stringBufferstringBuffer.append(str);}//按照字符串循環輸出stringBufferSystem.out.println(stringBuffer.toString());//關閉method的httpclient連接method.releaseConnection();}}post
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importorg.apache.commons.httpclient.methods.PostMethod;importorg.apache.commons.httpclient.*;publicclassH_client_post{publicstaticvoidmain(String[]args)throwsIOException{HttpClientclient=newHttpClient();PostMethodmethod=newPostMethod("http://192.168.111.128/bak/login_post.php");//表單域的值,既post傳入的key=valueNameValuePair[]date={newNameValuePair("username","admin"),newNameValuePair("password","123457")};//method使用表單閾值method.setRequestBody(date);//提交表單client.executeMethod(method);//字符流轉字節流循環輸出,同get解釋InputStreaminputStream=method.getResponseBodyAsStream();BufferedReaderbr=newBufferedReader(newInputStreamReader(inputStream,"UTF-8"));StringBufferstringBuffer=newStringBuffer();Stringstr="";while((str=br.readLine())!=null){stringBuffer.append(str);}System.out.println(stringBuffer.toString());method.releaseConnection();}}三.
Http協議的重要性相信不用我多說了,HttpClient相比傳統JDK自帶的URLConnection,增加了易用性和靈活性(具體區別,日後我們再討論),它不僅是客戶端發送Http請求變得容易,而且也方便了開發人員測試接口(基於Http協議的),即提高了開發的效率,也方便提高代碼的健壯性。因此熟練掌握HttpClient是很重要的必修內容,掌握HttpClient後,相信對於Http協議的了解會更加深入。
一、簡介
HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。 HttpClient已經應用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。
二、特性
1. 基於標準、純淨的java語言。實現了Http1.0和Http1.1
2. 以可擴展的面向對象的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支持HTTPS協議。
4. 通過Http代理建立透明的連接。
5. 利用CONNECT方法通過Http代理建立隧道的https連接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。
7. 插件式的自定義認證方案。
8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
9. 連接管理器支持多線程應用。支持設置最大連接數,同時支持設置每個主機的最大連接數,發現並關閉過期的連接。
10. 自動處理Set-Cookie中的Cookie。
11. 插件式的自定義Cookie策略。
12. Request的輸出流可以避免流中內容直接緩衝到socket服務器。
13. Response的輸入流可以有效的從socket服務器直接讀取相應內容。
14. 在http1.0和http1.1中利用KeepAlive保持持久連接。
15. 直接獲取服務器發送的response code和headers。
16. 設置連接超時的能力。
17. 實驗性的支持http1.1 response caching。
18. 源代碼基於Apache License 可免費獲取。
三、使用方法
使用HttpClient發送請求、接收響應很簡單,一般需要如下幾步即可。
1. 創建HttpClient對象。
2. 創建請求方法的實例,並指定請求URL。如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。
3. 如果需要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(HttpEntity entity)方法來設置請求參數。
4. 調用HttpClient對象的execute(HttpUriRequest request)發送請求,該方法返回一個HttpResponse。
5. 調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可通過該對象獲取服務器的響應內容。
6. 釋放連接。無論執行方法是否成功,都必須釋放連接
四、實例
package com.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; import javax.net.ssl.SSLContext; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.junit.Test; public class HttpClientTest { @Test public void jUnitTest() { get(); } /** * HttpClient連接SSL */ public void ssl() { CloseableHttpClient httpclient = null; try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore")); try { 54. // 加載keyStore d://tomcat.keystore trustStore.load(instream, "123456".toCharArray()); } catch (CertificateException e) { e.printStackTrace(); } finally { try { instream.close(); } catch (Exception ignore) { } } // 相信自己的CA和所有自簽名的證書SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build(); // 只允許使用TLSv1協議SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // 創建http請求(get方式) HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("executing request" + httpget.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpget); try { HttpEntity entity = response.getEntity(); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); System.out.println(EntityUtils.toString(entity)); EntityUtils.consume(entity); } } finally { response.close(); } } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } finally { if (httpclient != null) { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * post方式提交表單(模擬用戶登錄請求) */ public void postForm() { // 創建默認的httpClient實例. CloseableHttpClient httpclient = HttpClients.createDefault(); // 創建httppost HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // 創建參數隊列List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("username", "admin")); formparams.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity uefEntity; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); System.out.println("executing request " + httppost.getURI()); CloseableHttpResponse response = httpclient.execute(httppost); try { HttpEntity entity = response.getEntity(); if (entity != null) { System.out.println("--------------------------------------"); System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("--------------------------------------"); } } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 關閉連接,釋放資源try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 發送post請求訪問本地應用並根據傳遞參數不同返回不同結果*/ public void post() { // 創建默認的httpClient實例. CloseableHttpClient httpclient = HttpClients.createDefault(); // 創建httppost HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // 創建參數隊列List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); UrlEncodedFormEntity uefEntity; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); System.out.println("executing request " + httppost.getURI()); CloseableHttpResponse response = httpclient.execute(httppost); try { HttpEntity entity = response.getEntity(); if (entity != null) { System.out.println("--------------------------------------"); System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("--------------------------------------"); } } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 關閉連接,釋放資源try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 發送get請求*/ public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { // 創建httpget. HttpGet httpget = new HttpGet("http://www.baidu.com/"); System.out.println("executing request " + httpget.getURI()); // 執行get請求. CloseableHttpResponse response = httpclient.execute(httpget); try { // 獲取響應實體HttpEntity entity = response.getEntity(); System.out.println("--------------------------------------"); // 打印響應狀態System.out.println(response.getStatusLine()); if (entity != null) { // 打印響應內容長度System.out.println("Response content length: " + entity.getContentLength()); // 打印響應內容System.out.println("Response content: " + EntityUtils.toString(entity)); } System.out.println("------------------------------------"); } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 關閉連接,釋放資源try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 上傳文件*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action"); FileBody bin = new FileBody(new File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>以上這篇java發送HttpClient請求及接收請求結果過程的簡單實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。