注:本文來源於《java http post/get 服務端和客戶端實現json傳輸》html
最近須要寫http post接口因此學習下。java
總的仍是不難直接上源碼!web
PostHttpClient.java 客戶端 import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; import org.apache.commons.httpclient.methods.EntityEnclosingMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.RequestEntity; /** * ******************************************************** * 採用httpclient插件的post方式發送流二進制流數據到HTTP服務端 ********************************************************** * ---@author [zt_zoro1272@163.com ] ********************************************************** * ---@version ********************************************************** * ---@since 2014-8-28 */ public class PostHttpClient { /** * ******************************************************** * ---功能描述: 發送post請求,客戶端採用二進制流發送,服務端採用二進制流介紹 ********************************************************** * ---@param json 入參的json格式的報文 * ---@param url http服務器的地址 * ---@return 返回響應信息 ********************************************************** * ---@author [zt_zoro1272@163.com ] ********************************************************** * ---@since 2014-8-28 ********************************************************** * ---@update:[變動日期YYYY-MM-DD][更改人姓名][變動描述] ********************************************************** * */ public static String postHttpReq(String json,String url) { HttpClient httpClient = new HttpClient(); byte b[] = json.getBytes();//把字符串轉換爲二進制數據 RequestEntity requestEntity = new ByteArrayRequestEntity(b); EntityEnclosingMethod postMethod = new PostMethod(); postMethod.setRequestEntity(requestEntity);// 設置數據 postMethod.setPath(url);// 設置服務的url postMethod.setRequestHeader("Content-Type", "text/html;charset=GBK");// 設置請求頭編碼 // 設置鏈接超時 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout( 5 * 1000); // 設置讀取超時 httpClient.getHttpConnectionManager().getParams().setSoTimeout(20 * 1000); String responseMsg = ""; int statusCode = 0; try { statusCode = httpClient.executeMethod(postMethod);// 發送請求 responseMsg = postMethod.getResponseBodyAsString();// 獲取返回值 } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { postMethod.releaseConnection();// 釋放鏈接 } if (statusCode != HttpStatus.SC_OK) { System.out.println("HTTP服務異常" + statusCode); } return responseMsg; } //POST方式發送HTTP請求 public static void main(String[] args) { String json = "{\"PubInfo\": {\"clinet\": \"10.70.128.132\",\"company\": \"月月鳥0820\"},\"Request\": {\"strBillId\": \"18221075148\",\"strCcsOpId\": \"1234\"}}"; String url = "http://localhost:8080/httl_online/postHttpServer"; String outPackage = null; outPackage = postHttpReq(json, url); System.out.println("客戶端日誌----POST方式調用HTTP,請求報文爲:" + json); System.out .println("\nauthor<pantp>===========客戶端日誌----POST方式調用HTTP服務,HTTP服務端響應報文以下:=============\n"); System.out.println(outPackage); System.out .println("\nauthor<pantp>================================================================\n"); } }
PostHttpServer.java 服務端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.security.Principal; import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * ******************************************************** * 模擬的一個Http服務,處理客戶端的post請求 ********************************************************** * ---@author [zt_zoro1272@163.com ] ********************************************************** * ---@version ********************************************************** * ---@since 2014-8-28 */ public class PostHttpServer extends HttpServlet { private static final long serialVersionUID = 1L; /* * 代碼邏輯分如下三部分: * 1.得到請求報文 * 2.根據請求報文的信息去作業務邏輯,而後封裝返回報文 * 3.輸出相應報文 */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String inJson = null;// 保存HTTP客戶端請求報文 String outJson = null;// 保存HTTP服務端輸出報文 // 得到輸人報文而後打印出來 inJson = getInJson(request); System.out .println("\nauthor<pantp>===========服務端日誌----POST方式接收HTTP請求,HTTP服務端收到的請求報文以下:==========\n"); System.out.println(inJson); System.out .println("\nauthor<pantp>=================================================================\n"); // 如下代碼部分得到請求報文,而後去作校驗,轉換以及其餘的調用其餘的業務邏輯等,這裏就無論它 // ........................................................................ // 下面部分是輸出部分的處理 outJson = "{\"Response\": {\"code\": \"0\",\"message\": \"成功\",\"data\": \"12345\"}}";// 輸出不部分也以JSON格式的字符串輸出,這裏我就寫死 response.setContentType("application/json; charset=UTF-8"); response.getWriter().print(outJson); } // 得到請求的報文,並做簡單的校驗 public String getInJson(HttpServletRequest request) throws IOException { byte buffer[] = new byte[64 * 1024]; InputStream in = request.getInputStream();// 獲取輸入流對象 int len = in.read(buffer); // 必須對數組長度進行判斷,不然在new byte[len]會報NegativeArraySizeException異常 if (len < 0) { throw new IOException("請求報文爲空"); } String encode = request.getCharacterEncoding();// 獲取請求頭編碼 // 必須對編碼進行校驗,不然在new String(data, encode);會報空指針異常 if (null == encode || encode.trim().length() < 0) { throw new IOException("請求報文未指明請求編碼"); } byte data[] = new byte[len]; // 把buffer數組的值複製到data數組 System.arraycopy(buffer, 0, data, 0, len); // 經過使用指定的 charset 解碼指定的 byte 數組,構造一個新的 String String inJson = new String(data, encode); return inJson; } // 不提供get的處理方式 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String inJson = null;// 保存HTTP客戶端請求報文 String outJson = null;// 保存HTTP服務端輸出報文 // 得到輸人報文而後打印出來 inJson = getInJson(request); System.out .println("\nauthor<pantp>===========服務端日誌----POST方式接收HTTP請求,HTTP服務端收到的請求報文以下:==========\n"); System.out.println(inJson); System.out .println("\nauthor<pantp>=================================================================\n"); // 如下代碼部分得到請求報文,而後去作校驗,轉換以及其餘的調用其餘的業務邏輯等,這裏就無論它 // ........................................................................ // 下面部分是輸出部分的處理 outJson = "{\"Response\": {\"code\": \"0\",\"message\": \"成功\",\"data\": \"12345\"}}";// 輸出不部分也以JSON格式的字符串輸出,這裏我就寫死 response.setContentType("application/json; charset=UTF-8"); response.getWriter().print(outJson); } }
<!-- 模擬HTTP的調用,寫的一個只處理POST請求的http服務 --> <servlet> <servlet-name>PostHttpServer</servlet-name> <servlet-class>com.sitechasia.xinnet.online.util.cloudhttp.PostHttpServer</servlet-class> </servlet> <servlet-mapping> <servlet-name>PostHttpServer</servlet-name> <url-pattern>/postHttpServer</url-pattern> </servlet-mapping>