OkHttp3 請(qǐng)求方式 get矾芙、post

之前用的是 HttpClient ,發(fā)現(xiàn)好難用近上!
后來發(fā)現(xiàn) OkHttp3 這個(gè)請(qǐng)求工具挺好用的剔宪!
目前只封裝了 get、post 戈锻、以及文件流上傳

        <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.2.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.1-jre</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

更新日志:

2020/12/28 新增 獲取 URL 數(shù)據(jù)流(用于用于獲取遠(yuǎn)程圖片等IO流)
2019/11/21 新增 JSON格式數(shù)據(jù)請(qǐng)求

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.util.Iterator;
import java.util.Map;

/**
 * 封裝請(qǐng)求
 * @author weiximei
 */
public class OkHttpRequestUtils {

    /**
     * 定義請(qǐng)求客戶端
     */
    private static OkHttpClient client = new OkHttpClient();

    /**
     * get 請(qǐng)求
     * @param url 請(qǐng)求URL
     * @return
     * @throws Exception
     */
    public static String doGet(String url) throws Exception {
        return doGet(url, Maps.newHashMap());
    }


    /**
     * get 請(qǐng)求
     * @param url 請(qǐng)求URL
     * @param query 攜帶參數(shù)參數(shù)
     * @return
     * @throws Exception
     */
    public static String doGet(String url, Map<String, Object> query) throws Exception {

        return doGet(url, Maps.newHashMap(), query);
    }

    /**
     * get 請(qǐng)求
     * @param url url
     * @param header 請(qǐng)求頭參數(shù)
     * @param query 參數(shù)
     * @return
     */
    public static String doGet(String url, Map<String, Object> header, Map<String, Object> query) throws Exception {

        // 創(chuàng)建一個(gè)請(qǐng)求 Builder
        Request.Builder builder = new Request.Builder();
        // 創(chuàng)建一個(gè) request
        Request request = builder.url(url).build();

        // 創(chuàng)建一個(gè) HttpUrl.Builder
        HttpUrl.Builder urlBuilder = request.url().newBuilder();
        // 創(chuàng)建一個(gè) Headers.Builder
        Headers.Builder headerBuilder = request.headers().newBuilder();

        // 裝載請(qǐng)求頭參數(shù)
        Iterator<Map.Entry<String, Object>> headerIterator = header.entrySet().iterator();
        headerIterator.forEachRemaining(e -> {
            headerBuilder.add(e.getKey(), (String) e.getValue());
        });

        // 裝載請(qǐng)求的參數(shù)
        Iterator<Map.Entry<String, Object>> queryIterator = query.entrySet().iterator();
        queryIterator.forEachRemaining(e -> {
            urlBuilder.addQueryParameter(e.getKey(), (String) e.getValue());
        });

        // 設(shè)置自定義的 builder
        // 因?yàn)?get 請(qǐng)求的參數(shù)歼跟,是在 URL 后面追加  http://xxxx:8080/user?name=xxxx?sex=1
        builder.url(urlBuilder.build()).headers(headerBuilder.build());

        try (Response execute = client.newCall(builder.build()).execute()) {
            return execute.body().string();
        }
    }

    /**
     * post 請(qǐng)求, 請(qǐng)求參數(shù) 并且 攜帶文件上傳
     * @param url
     * @param header
     * @param parameter
     * @param file 文件
     * @param fileFormName 遠(yuǎn)程接口接收 file 的參數(shù)
     * @return
     * @throws Exception
     */
    public static String doPost(String url, Map<String, Object> header, Map<String, Object> parameter, File file, String fileFormName) throws Exception {

        // 創(chuàng)建一個(gè)請(qǐng)求 Builder
        Request.Builder builder = new Request.Builder();
        // 創(chuàng)建一個(gè) request
        Request request = builder.url(url).build();

        // 創(chuàng)建一個(gè) Headers.Builder
        Headers.Builder headerBuilder = request.headers().newBuilder();

        // 裝載請(qǐng)求頭參數(shù)
        Iterator<Map.Entry<String, Object>> headerIterator = header.entrySet().iterator();
        headerIterator.forEachRemaining(e -> {
            headerBuilder.add(e.getKey(), (String) e.getValue());
        });

        // 或者 FormBody.create 方式格遭,只適用于接口只接收文件流的情況
        // RequestBody requestBody = FormBody.create(MediaType.parse("application/octet-stream"), file);
        MultipartBody.Builder requestBuilder = new MultipartBody.Builder();

        // 狀態(tài)請(qǐng)求參數(shù)
        Iterator<Map.Entry<String, Object>> queryIterator = parameter.entrySet().iterator();
        queryIterator.forEachRemaining(e -> {
            requestBuilder.addFormDataPart(e.getKey(), (String) e.getValue());
        });

        if (null != file) {
            // application/octet-stream
            requestBuilder.addFormDataPart(StringUtils.isNotBlank(fileFormName) ? fileFormName : "file", file.getName(), RequestBody.create(file, MediaType.parse("application/octet-stream")));
        }

        // 設(shè)置自定義的 builder
        builder.headers(headerBuilder.build()).post(requestBuilder.build());

        // 然后再 build 一下
        try (Response execute = client.newCall(builder.build()).execute()) {
            return execute.body().string();
        }
    }

    /**
     * post 請(qǐng)求哈街, 請(qǐng)求參數(shù) 并且 攜帶文件上傳二進(jìn)制流
     * @param url
     * @param header
     * @param parameter
     * @param fileName 文件名
     * @param fileByte 文件的二進(jìn)制流
     * @param fileFormName 遠(yuǎn)程接口接收 file 的參數(shù)
     * @return
     * @throws Exception
     */
    public static String doPost(String url, Map<String, Object> header, Map<String, Object> parameter, String fileName, byte [] fileByte, String fileFormName) throws Exception {
        // 創(chuàng)建一個(gè)請(qǐng)求 Builder
        Request.Builder builder = new Request.Builder();
        // 創(chuàng)建一個(gè) request
        Request request = builder.url(url).build();

        // 創(chuàng)建一個(gè) Headers.Builder
        Headers.Builder headerBuilder = request.headers().newBuilder();

        // 裝載請(qǐng)求頭參數(shù)
        Iterator<Map.Entry<String, Object>> headerIterator = header.entrySet().iterator();
        headerIterator.forEachRemaining(e -> {
            headerBuilder.add(e.getKey(), (String) e.getValue());
        });

        MultipartBody.Builder requestBuilder = new MultipartBody.Builder();

        // 狀態(tài)請(qǐng)求參數(shù)
        Iterator<Map.Entry<String, Object>> queryIterator = parameter.entrySet().iterator();
        queryIterator.forEachRemaining(e -> {
            requestBuilder.addFormDataPart(e.getKey(), (String) e.getValue());
        });

        if (fileByte.length > 0) {
            // application/octet-stream
            requestBuilder.addFormDataPart(StringUtils.isNotBlank(fileFormName) ? fileFormName : "file", fileName, RequestBody.create(fileByte, MediaType.parse("application/octet-stream")));
        }

        // 設(shè)置自定義的 builder
        builder.headers(headerBuilder.build()).post(requestBuilder.build());

        try (Response execute = client.newCall(builder.build()).execute()) {
            return execute.body().string();
        }
    }


    /**
     * post 請(qǐng)求  攜帶文件上傳
     * @param url
     * @param file
     * @return
     * @throws Exception
     */
    public static String doPost(String url, File file, String fileFormName) throws Exception {
        return doPost(url, Maps.newHashMap(), Maps.newHashMap(), file, fileFormName);
    }

    /**
     * post 請(qǐng)求
     * @param url
     * @param header 請(qǐng)求頭
     * @param parameter 參數(shù)
     * @return
     * @throws Exception
     */
    public static String doPost(String url, Map<String, Object> header, Map<String, Object> parameter) throws Exception {
        return doPost(url, header, parameter, null, null);
    }

    /**
     * post 請(qǐng)求
     * @param url
     * @param parameter 參數(shù)
     * @return
     * @throws Exception
     */
    public static String doPost(String url, Map<String, Object> parameter) throws Exception {
        return doPost(url, Maps.newHashMap(), parameter, null, null);
    }

    /**
     * JSON數(shù)據(jù)格式請(qǐng)求
     * @param url
     * @param header
     * @param json
     * @return
     */
    private static String json(String url, Map<String, Object> header,String json) throws IOException {
        // 創(chuàng)建一個(gè)請(qǐng)求 Builder
        Request.Builder builder = new Request.Builder();
        // 創(chuàng)建一個(gè) request
        Request request = builder.url(url).build();

        // 創(chuàng)建一個(gè) Headers.Builder
        Headers.Builder headerBuilder = request.headers().newBuilder();

        // 裝載請(qǐng)求頭參數(shù)
        Iterator<Map.Entry<String, Object>> headerIterator = header.entrySet().iterator();
        headerIterator.forEachRemaining(e -> {
            headerBuilder.add(e.getKey(), (String) e.getValue());
        });

        // application/octet-stream
        RequestBody requestBody = FormBody.create(json, MediaType.parse("application/json"));

        // 設(shè)置自定義的 builder
        builder.headers(headerBuilder.build()).post(requestBody);

        try (Response execute = client.newCall(builder.build()).execute()) {
            return execute.body().string();
        }
    }

    /**
     * post請(qǐng)求  參數(shù)JSON格式
     * @param url
     * @param header 請(qǐng)求頭
     * @param json JSON數(shù)據(jù)
     * @return
     * @throws IOException
     */
    public static String doPost(String url, Map<String, Object> header,String json) throws IOException {
        return json(url, header, json);
    }

    /**
     * post請(qǐng)求  參數(shù)JSON格式
     * @param url
     * @param json JSON數(shù)據(jù)
     * @return
     * @throws IOException
     */
    public static String doPost(String url,String json) throws IOException {
        return json(url, Maps.newHashMap(), json);
    }

    /**
     * 獲取 url 數(shù)據(jù)流
     * ps: 用于獲取遠(yuǎn)程圖片等
     * @param url
     * @return
     * @throws IOException
     */
    public static byte[] doGetByte(String url) throws IOException {
        // 創(chuàng)建一個(gè)請(qǐng)求 Builder
        Request.Builder builder = new Request.Builder();
        // 創(chuàng)建一個(gè) request
        builder.url(url);

        try (Response execute = client.newCall(builder.build()).execute()) {
            return execute.body().bytes();
        }
    }

}

現(xiàn)在寫個(gè) main 方法測(cè)試

    public static void main(String[] args) throws Exception {
        /**
         * JSON 數(shù)據(jù)請(qǐng)求
         */
        Map<String, Object> headerMap = Maps.newHashMap();
        headerMap.put("app_key","xxx999");
        headerMap.put("sign","xxxxxx212bc7c939bb");

        Map<String, Object> dataMap = Maps.newHashMap();
        dataMap.put("appKey", "xxx999");
        dataMap.put("shipId","xxx000668888");

        Map<String, Object> jsonMap = Maps.newHashMap();
        jsonMap.put("action", "xxxlogistics.querylst");
        jsonMap.put("data", dataMap);

        // JSON 字符串
        System.out.println(OkHttpRequestUtils.doPost("http://localhost:8080/openapi-api", headerMap, JSONObject.toJSONString(jsonMap)));


        /**
         * 上傳文件
         */
        byte [] fileByte = null;

        File file = new File("file-read-4182.jpg");
        FileInputStream fileInputStream = new FileInputStream(file);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int n;
        while ((n = fileInputStream.read(b)) != -1)
        {
            bos.write(b, 0, n);
        }
        fileInputStream.close();
        bos.close();
        fileByte = bos.toByteArray();


        Map<String, Object> queryMap = Maps.newHashMap();
        queryMap.put("pageNum","2");
        queryMap.put("pageSize","50");
        System.out.println(OkHttpRequestUtils.doPost("http://localhost:8566/uploadImage" , Maps.newHashMap(), Maps.newHashMap(),file.getName(), fileByte, "uploadFile"));

        /**
         * 獲取遠(yuǎn)程圖片IO數(shù)據(jù)流
         */
        byte[] imgByte = doGetByte("你的圖片地址");
        System.out.println(imgByte)
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拒迅,隨后出現(xiàn)的幾起案子骚秦,更是在濱河造成了極大的恐慌,老刑警劉巖璧微,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作箍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡前硫,警方通過查閱死者的電腦和手機(jī)胞得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屹电,“玉大人阶剑,你說我怎么就攤上這事∥:牛” “怎么了牧愁?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)外莲。 經(jīng)常有香客問我猪半,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任磨确,我火速辦了婚禮沽甥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俐填。我一直安慰自己安接,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布英融。 她就那樣靜靜地躺著,像睡著了一般歇式。 火紅的嫁衣襯著肌膚如雪驶悟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天材失,我揣著相機(jī)與錄音痕鳍,去河邊找鬼。 笑死龙巨,一個(gè)胖子當(dāng)著我的面吹牛笼呆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旨别,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诗赌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了秸弛?” 一聲冷哼從身側(cè)響起铭若,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎递览,沒想到半個(gè)月后叼屠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绞铃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年镜雨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儿捧。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荚坞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纯命,到底是詐尸還是另有隱情西剥,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布亿汞,位于F島的核電站瞭空,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咆畏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一南捂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旧找,春花似錦溺健、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至魏颓,卻和暖如春岭辣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甸饱。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工沦童, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叹话。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓偷遗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驼壶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氏豌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容