java http post/get 服務端和客戶端實現json傳輸


注:本文來源於《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);
    }


}
web.xml配置
<!-- 模擬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>
相關文章
相關標籤/搜索