Java 輕量級 Http 請求框架

輕量級Http請求框架。清晰明了的請求接口描述,靈活的擴展機制。 快捷接口: 支持同步調用; 支持異步調用,異步回調; 支持JSON自動轉換為指定類型; 支持自定義輸入參數驗證; 支持自定義結果解析; 支持自定義頭部;

高級操作: 支持快速擴展請求接口,通過Ann描述,請求路徑,參數等一目了然; 支持參數驗證規則,URL生成規則,請求參數組裝規則,結果解析皆可動態替換。 自動生成接口描述

適用場景: 適用于JAVA服務端通過HttpClient請求外部服務,Android客戶端訪問服務器接口請求數據。 針對各開放平臺提供的接口開發客戶端訪問POJO,通過配置清晰明了,操作簡便。如:微信開放平臺接口,百度開放平臺接口,阿里開發平臺接口等。 針對多系統之間通過HttpClient的數據交互功能,可針對相應訪問接口快速開發訪問POJO,統一風格,便于維護。如:訪問Solr等。

  • 請求執行過程,執行過程如下:
  • 1.根據@WSRequest注解描述生成請求上下文。若沒有@WSRequest注解則拋出異常。
  • 2.調用init(context)方法執行初始化,主要是向contex中添加數據,或者添加自定義處理器。
  • 3.添加默認處理器。請求前處理順序:默認值初始化,驗證參數,生成請求參數,生成URL。請求后處理:解析結果。
  • 3.1首選根據配置文件獲取指定的默認處理器,若配置文件中沒有指定,則使用org.ws.httphelper.request.handler.impl包中的默認處理器。
  • 4.執行請求前處理,按照順序依次執行。
  • 4.1默認初始化處理:若注解描述中存在默認值,并且參數沒有輸入值,則為參數設置該默認值。
  • 4.2驗證參數處理:根據注解描述,驗證必須值,驗證輸入參數類型,根據正則驗證。
  • 4.3生成請求參數處理:根據配置的參數或者動態添加的參數生成請求參數。自動識別普通參數,數組參數,文件參數。
  • 4.4生成URL處理:根據輸入key的值自動匹配替換URL中{key}的值。
  • 5.執行請求。
  • 6.執行請求后處理,按照順序依次執行。
  • 6.1解析結果處理:只解析JSON為指定的對象。
  • 7.清理緩存。不清理Cookie。要清除Cookie通過context.clearCookie()。

簡單使用實例:

package org.ws.httphelper;

import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ws.httphelper.exception.WSException;
import org.ws.httphelper.model.ResponseResult;
import org.ws.httphelper.request.handler.CallbackHandler;
import sun.security.provider.MD5;
import sun.security.rsa.RSASignature;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 15-12-11.
 */
public class TestWSHttpHelper extends TestCase {
    protected static Log log = LogFactory.getLog(TestWSHttpHelper.class);

    /**
     * 測試獲取HTML
     * @throws Exception
     */
    public void testDoGetHtml()throws Exception{
        String html=WSHttpHelper.doGetHtml("http://git.oschina.net/wolfsmoke/WSHttpHelper");
        System.out.print(html);
    }

    /**
     * 測試帶有回調的HTML
     * @throws Exception
     */
    public void testDoGetHtmlCallBack()throws Exception{
        Map<String,Object> parameters = new HashMap<String, Object>();
        parameters.put("wq","WSHttpHelper");
        String html=WSHttpHelper.doGetHtml("http://www.baidu.com/s", parameters,"UTF-8", new CallbackHandler() {
            @Override
            public ResponseResult execute(ResponseResult result) throws WSException {
                String html=result.getBody().toString();
                html+="\n在回調里面修改返回結果。";
                result.setBody(html);
                return result;
            }
        });
        TestCase.assertTrue(html.endsWith("在回調里面修改返回結果。"));
        log.debug(html);
    }

    /**
     * 測試獲取byte[],下載文件
     * @throws Exception
     */
    public void testDoGetByteArray()throws Exception{
        // 下載個文件
        String url="http://mirror.bit.edu.cn/apache//commons/io/binaries/commons-io-2.4-bin.zip";
        // 執行請求
        byte[] fileBytes=WSHttpHelper.doGetByteArray(url);
        String filePath=FileUtils.getTempDirectoryPath()+"commons-io-2.4-bin.zip";
        File file  = new File(filePath);
        FileUtils.writeByteArrayToFile(file, fileBytes);
        TestCase.assertEquals("a732ec8558d464e7c5d8136e5aa9d85c",getMd5ByFile(file));
    }
    /**
     * 測試帶有回調的獲取byte[],下載文件
     * @throws Exception
     */
    public void testDoGetByteArrayCallBack()throws Exception{
        // 下載個文件
        String url="http://mirror.bit.edu.cn/apache//commons/io/binaries/commons-io-2.4-bin.zip";
        // 執行請求
        byte[] filePath=WSHttpHelper.doGetByteArray(url, null, new CallbackHandler() {
            @Override
            public ResponseResult execute(ResponseResult result) throws WSException {
                String saveFilePath=FileUtils.getTempDirectoryPath()+"commons-io-2.4-bin.zip";
                File file  = new File(saveFilePath);
                try {
                    FileUtils.writeByteArrayToFile(file,(byte[])result.getBody());
                } catch (IOException e) {
                    throw new WSException(e);
                }
                result.setBody(saveFilePath.getBytes());
                return result;
            }
        });
        String path = new String(filePath);
        File file  = new File(path);
        log.debug(path);
        TestCase.assertEquals("a732ec8558d464e7c5d8136e5aa9d85c",getMd5ByFile(file));
    }

    /**
     * 獲取文件md5
     * @param file
     * @return
     * @throws FileNotFoundException
     */
    public String getMd5ByFile(File file) throws FileNotFoundException {
        String value = null;
        FileInputStream in = new FileInputStream(file);
        try {
            MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(byteBuffer);
            BigInteger bi = new BigInteger(1, md5.digest());
            value = bi.toString(16);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return value;
    }

    /**
     * 測試獲取JSON,解析為MAP
     * @throws Exception
     */
    public void testDoGetMap()throws Exception{
        String url="https://www.hao123.com/sugdata_s4.json?r=-805836";
        Map resultMap = WSHttpHelper.doGetMap(url);
        TestCase.assertEquals("http://top.baidu.com/",resultMap.get("baseUrl"));
        TestCase.assertEquals("Success",resultMap.get("errormsg"));
    }
    /**
     * 測試帶有回調的獲取JSON,解析為MAP
     * @throws Exception
     */
    public void testDoGetMapCallBack()throws Exception{
        String url="https://www.hao123.com/sugdata_s4.json?r=-805836";
        final Map resultMap = WSHttpHelper.doGetMap(url, null, new CallbackHandler() {
            @Override
            public ResponseResult execute(ResponseResult result) throws WSException {
                Map map = result.getBody(Map.class);
                map.put("testKey","testValue");
                result.setBody(map);
                return result;
            }
        });
        TestCase.assertEquals("http://top.baidu.com/",resultMap.get("baseUrl"));
        TestCase.assertEquals("Success",resultMap.get("errormsg"));
        TestCase.assertEquals("testValue",resultMap.get("testKey"));
    }

    /**
     * 測試獲取JSON,將JSON解析為指定類型
     * @throws Exception
     */
    public void testDoGetJson()throws Exception{
        String url="https://www.hao123.com/sugdata_s4.json?r=-805836";
        Map resultMap = WSHttpHelper.doGetJson(url, Map.class);
        TestCase.assertEquals("http://top.baidu.com/",resultMap.get("baseUrl"));
        TestCase.assertEquals("Success",resultMap.get("errormsg"));
    }
    /**
     * 測試帶有回調的獲取JSON,將JSON解析為指定類型
     * @throws Exception
     */
    public void testDoGetJsonCallBack()throws Exception{
        String url="https://www.hao123.com/sugdata_s4.json?r=-805836";
        final Map resultMap = WSHttpHelper.doGetJson(url, new CallbackHandler() {
            @Override
            public ResponseResult execute(ResponseResult result) throws WSException {
                Map map = result.getBody(Map.class);
                map.put("testKey", "testValue");
                result.setBody(map);
                return result;
            }
        }, Map.class);
        TestCase.assertEquals("http://top.baidu.com/",resultMap.get("baseUrl"));
        TestCase.assertEquals("Success",resultMap.get("errormsg"));
        TestCase.assertEquals("testValue",resultMap.get("testKey"));
    }

}

高級應用實例:

/***********************************/
/******定義接口對應請求類***********/
/***********************************/
package org.ws.baidu.api;

import org.ws.httphelper.annotation.Parameter;
import org.ws.httphelper.annotation.WSRequest;
import org.ws.httphelper.model.WSRequestContext;
import org.ws.httphelper.request.WSHttpAbstractRequest;

/**

 * Created by Administrator on 15-12-11.

 * 按照以下接口介紹開發對應接口實例

 * http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-placeapi

 */
@WSRequest(
        name = "Place API 提供區域檢索POI服務與POI詳情服務",
        url = "http://api.map.baidu.com/place/v2/search",
        method = WSRequest.MethodType.GET,
        responseType = WSRequest.ResponseType.JSON,
        charset = "UTF-8",
        parameters = {
                @Parameter(name="q",description = "檢索關鍵字",required = true,example = "中關村、ATM、百度大廈"),
                @Parameter(name="region",description = "檢索區域",required = true,example = "北京"),
                @Parameter(name="output",description = "輸出格式",defaultValue = "json",example = "日式燒烤/鐵板燒、朝外大街"),
                @Parameter(name="scope",description = "檢索結果詳細程度",required = true,defaultValue = "1",example = ""),
                @Parameter(name="filter",description = "檢索過濾條件",example = ""),
                @Parameter(name="page_size",description = "范圍記錄數量",defaultValue = "10",example = ""),
                @Parameter(name="page_num",description = "范圍記錄數量",defaultValue = "0",example = ""),
                @Parameter(name="ak",description = "用戶的訪問密鑰",required = true,example = ""),
                @Parameter(name="sn",description = "用戶的權限簽名",example = ""),
                @Parameter(name="timestamp",description = "設置sn后該值必填",example = "")
        }
)
public class PlaceAPI extends WSHttpAbstractRequest {
    public void init(WSRequestContext context){
        context.addInputData("ak","E4805d16520de693a3fe707cdc962045");
    }
}
/***********************************/
/***********測試接口****************/
/***********************************/
package org.ws.baidu.api;

import junit.framework.TestCase;
import org.ws.httphelper.WSHttpHelper;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 15-12-11.
 */
public class TestPlaceAPI extends TestCase {
    public void testRequest()throws Exception{
        PlaceAPI api = new PlaceAPI();
        api.addParameter("q","飯店");
        api.addParameter("region","北京");
        System.out.println(api.execute().getBody().toString());
        System.out.println(api.getContext().getUrl());
    }

    public void testDoGet()throws Exception{
        Map<String,Object> param = new HashMap<String,Object>();
        param.put("uid","5a8fb739999a70a54207c130");
        param.put("ak","E4805d16520de693a3fe707cdc962045");
        param.put("output","json");
        param.put("scope","2");
        Object obj=WSHttpHelper.doGetHtml("http://api.map.baidu.com/place/v2/detail", param);
        System.out.print(obj.toString());
    }
}

聲明:文章"Java 輕量級 Http 請求框架"為相王科技 Array原創文章,轉載請注明出處,謝謝合作!
国产精品免费视频每日更新_久久AV七七AV_被多人玩弄的烂货_国产片手机永久免费观看