最近需要寫http post接口所以學習下。
總的還是不難直接上源碼!
1 PostHttpClient.java 客戶端 2 import java.io.IOException; 3 import org.apache.commons.httpclient.HttpClient; 4 import org.apache.commons.httpclient.HttpException; 5 import org.apache.commons.httpclient.HttpStatus; 6 import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; 7 import org.apache.commons.httpclient.methods.EntityEnclosingMethod; 8 import org.apache.commons.httpclient.methods.PostMethod; 9 import org.apache.commons.httpclient.methods.RequestEntity; 10 11 12 /** 13 * ******************************************************** 14 * 采用httpclient插件的post方式發送流二進制流數據到HTTP服務端 15 ********************************************************** 16 * ---@author [zt_zoro1272@163.com ] 17 ********************************************************** 18 * ---@version 19 ********************************************************** 20 * ---@since 2014-8-28 21 */ 22 public class PostHttpClient { 23 24 25 /** 26 * ******************************************************** 27 * ---功能描述: 發送post請求,客戶端采用二進制流發送,服務端采用二進制流介紹 28 ********************************************************** 29 * ---@param json 入參的json格式的報文 30 * ---@param url http服務器的地址 31 * ---@return 返回響應信息 32 ********************************************************** 33 * ---@author [zt_zoro1272@163.com ] 34 ********************************************************** 35 * ---@since 2014-8-28 36 ********************************************************** 37 * ---@update:[變更日期YYYY-MM-DD][更改人姓名][變更描述] 38 ********************************************************** 39 * 40 */ 41 public static String postHttpReq(String json,String url) { 42 HttpClient httpClient = new HttpClient(); 43 44 byte b[] = json.getBytes();//把字符串轉換為二進制數據 45 RequestEntity requestEntity = new ByteArrayRequestEntity(b); 46 47 EntityEnclosingMethod postMethod = new PostMethod(); 48 postMethod.setRequestEntity(requestEntity);// 設置數據 49 postMethod.setPath(url);// 設置服務的url 50 postMethod.setRequestHeader("Content-Type", "text/html;charset=GBK");// 設置請求頭編碼 51 52 // 設置連接超時 53 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout( 54 5 * 1000); 55 // 設置讀取超時 56 httpClient.getHttpConnectionManager().getParams().setSoTimeout(20 * 1000); 57 58 String responseMsg = ""; 59 int statusCode = 0; 60 try { 61 statusCode = httpClient.executeMethod(postMethod);// 發送請求 62 responseMsg = postMethod.getResponseBodyAsString();// 獲取返回值 63 } catch (HttpException e) { 64 e.printStackTrace(); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } finally { 68 postMethod.releaseConnection();// 釋放連接 69 } 70 71 if (statusCode != HttpStatus.SC_OK) { 72 System.out.println("HTTP服務異常" + statusCode); 73 } 74 return responseMsg; 75 } 76 77 //POST方式發送HTTP請求 78 public static void main(String[] args) { 79 String json = "{\"PubInfo\": {\"clinet\": \"10.70.128.132\",\"company\": \"月月鳥0820\"},\"Request\": {\"strBillId\": \"18221075148\",\"strCcsOpId\": \"1234\"}}"; 80 String url = "http://localhost:8080/httl_online/postHttpServer"; 81 String outPackage = null; 82 outPackage = postHttpReq(json, url); 83 System.out.println("客戶端日志----POST方式調用HTTP,請求報文為:" + json); 84 System.out 85 .println("\nauthor<pantp>===========客戶端日志----POST方式調用HTTP服務,HTTP服務端響應報文如下:=============\n"); 86 87 System.out.println(outPackage); 88 89 System.out 90 .println("\nauthor<pantp>================================================================\n"); 91 } 92 93 }
1 PostHttpServer.java 服務端 2 import java.io.BufferedReader; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.net.URLDecoder; 7 import java.security.Principal; 8 import java.util.Arrays; 9 import java.util.Collections; 10 import java.util.Enumeration; 11 import java.util.HashMap; 12 import java.util.Locale; 13 import java.util.Map; 14 15 import javax.servlet.RequestDispatcher; 16 import javax.servlet.ServletException; 17 import javax.servlet.ServletInputStream; 18 import javax.servlet.http.Cookie; 19 import javax.servlet.http.HttpServlet; 20 import javax.servlet.http.HttpServletRequest; 21 import javax.servlet.http.HttpServletResponse; 22 import javax.servlet.http.HttpSession; 23 24 25 /** 26 * ******************************************************** 27 * 模擬的一個Http服務,處理客戶端的post請求 28 ********************************************************** 29 * ---@author [zt_zoro1272@163.com ] 30 ********************************************************** 31 * ---@version 32 ********************************************************** 33 * ---@since 2014-8-28 34 */ 35 public class PostHttpServer extends HttpServlet { 36 37 private static final long serialVersionUID = 1L; 38 39 /* 40 * 代碼邏輯分以下三部分: 41 * 1.獲得請求報文 42 * 2.根據請求報文的信息去做業務邏輯,然后封裝返回報文 43 * 3.輸出相應報文 44 */ 45 protected void doPost(HttpServletRequest request, 46 HttpServletResponse response) throws ServletException, IOException { 47 String inJson = null;// 保存HTTP客戶端請求報文 48 String outJson = null;// 保存HTTP服務端輸出報文 49 50 // 獲得輸人報文然后打印出來 51 inJson = getInJson(request); 52 System.out 53 .println("\nauthor<pantp>===========服務端日志----POST方式接收HTTP請求,HTTP服務端收到的請求報文如下:==========\n"); 54 System.out.println(inJson); 55 System.out 56 .println("\nauthor<pantp>=================================================================\n"); 57 58 // 以下代碼部分獲得請求報文,然后去做校驗,轉換以及其他的調用其他的業務邏輯等,這里就不管它 59 // ........................................................................ 60 61 // 下面部分是輸出部分的處理 62 outJson = "{\"Response\": {\"code\": \"0\",\"message\": \"成功\",\"data\": \"12345\"}}";// 輸出不部分也以JSON格式的字符串輸出,這里我就寫死 63 64 response.setContentType("application/json; charset=UTF-8"); 65 response.getWriter().print(outJson); 66 } 67 68 // 獲得請求的報文,並作簡單的校驗 69 public String getInJson(HttpServletRequest request) throws IOException { 70 71 byte buffer[] = new byte[64 * 1024]; 72 InputStream in = request.getInputStream();// 獲取輸入流對象 73 74 int len = in.read(buffer); 75 // 必須對數組長度進行判斷,否則在new byte[len]會報NegativeArraySizeException異常 76 if (len < 0) { 77 throw new IOException("請求報文為空"); 78 } 79 80 String encode = request.getCharacterEncoding();// 獲取請求頭編碼 81 // 必須對編碼進行校驗,否則在new String(data, encode);會報空指針異常 82 if (null == encode || encode.trim().length() < 0) { 83 throw new IOException("請求報文未指明請求編碼"); 84 } 85 86 byte data[] = new byte[len]; 87 88 // 把buffer數組的值復制到data數組 89 System.arraycopy(buffer, 0, data, 0, len); 90 91 // 通過使用指定的 charset 解碼指定的 byte 數組,構造一個新的 String 92 String inJson = new String(data, encode); 93 94 return inJson; 95 } 96 97 // 不提供get的處理方式 98 protected void doGet(HttpServletRequest request, HttpServletResponse response) 99 throws ServletException, IOException { 100 String inJson = null;// 保存HTTP客戶端請求報文 101 String outJson = null;// 保存HTTP服務端輸出報文 102 103 // 獲得輸人報文然后打印出來 104 inJson = getInJson(request); 105 System.out 106 .println("\nauthor<pantp>===========服務端日志----POST方式接收HTTP請求,HTTP服務端收到的請求報文如下:==========\n"); 107 System.out.println(inJson); 108 System.out 109 .println("\nauthor<pantp>=================================================================\n"); 110 111 // 以下代碼部分獲得請求報文,然后去做校驗,轉換以及其他的調用其他的業務邏輯等,這里就不管它 112 // ........................................................................ 113 114 // 下面部分是輸出部分的處理 115 outJson = "{\"Response\": {\"code\": \"0\",\"message\": \"成功\",\"data\": \"12345\"}}";// 輸出不部分也以JSON格式的字符串輸出,這里我就寫死 116 117 response.setContentType("application/json; charset=UTF-8"); 118 response.getWriter().print(outJson); 119 } 120 121 122 }
web.xml配置
1 <!-- 模擬HTTP的調用,寫的一個只處理POST請求的http服務 --> 2 <servlet> 3 <servlet-name>PostHttpServer</servlet-name> 4 <servlet-class>com.sitechasia.xinnet.online.util.cloudhttp.PostHttpServer</servlet-class> 5 </servlet> 6 7 <servlet-mapping> 8 <servlet-name>PostHttpServer</servlet-name> 9 <url-pattern>/postHttpServer</url-pattern> 10 </servlet-mapping> 11
這樣一個簡單的httl post客戶端就完成了,啟動tomcat直接執行客戶端mian方法就OK
