最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解java如何實(shí)現(xiàn)帶RequestBody傳Json參數(shù)的GET請(qǐng)求

 更新時(shí)間:2024年02月02日 09:04:51   作者:DaveCui  
在調(diào)試Fate平臺(tái)時(shí),遇到了一個(gè)奇葩的接口類型,該接口為Get方式,入?yún)⑹且粋€(gè)json類型在body中傳遞,使用body中傳參的話為什么不用POST請(qǐng)求而使用了GET請(qǐng)求,下面我們就來深入研究一下

在調(diào)試Fate平臺(tái)時(shí),我遇到了一個(gè)奇葩的接口類型。該接口為Get方式,入?yún)⑹且粋€(gè)json類型在body中傳遞。我非常費(fèi)解使用body中傳參的話為什么不用POST請(qǐng)求而使用了GET請(qǐng)求?

在本篇文章中加入了自己對(duì)這個(gè)問題的一點(diǎn)理解,以及通過java請(qǐng)求這個(gè)接口的完整可使用案例。(包括返回string類型和文件流類型)

一、接口調(diào)用方法

當(dāng)我看到這個(gè)接口的時(shí)候,我是有點(diǎn)懵的。Get請(qǐng)求為什么要采用這樣的參數(shù)傳遞方式,一般來說GET請(qǐng)求就直接將參數(shù)拼接在URL中了。

二、傳參方式的討論

GET和POST請(qǐng)求和其常見的傳參方式

我們知道GET和POST請(qǐng)求是HTTP協(xié)議中的兩種最常用的請(qǐng)求方式,它們?cè)谔幚韰?shù)和數(shù)據(jù)傳輸方面差距還是比較大的。

參數(shù)傳遞方式:GET請(qǐng)求的參數(shù)直接附加在URL的末尾,而POST請(qǐng)求的參數(shù)則包含在請(qǐng)求體中。

這意味著GET請(qǐng)求的參數(shù)是明文傳輸?shù)?,因此在?qǐng)求過程中可能會(huì)被記錄或泄露。而POST請(qǐng)求的參數(shù)則是加密的,相對(duì)更安全。

參數(shù)的數(shù)據(jù)類型:GET請(qǐng)求的參數(shù)只能發(fā)送簡(jiǎn)單的字符串,而POST請(qǐng)求可以發(fā)送復(fù)雜的數(shù)據(jù)類型,如表單數(shù)據(jù)、JSON數(shù)據(jù)等。

這使得POST請(qǐng)求相比GET請(qǐng)求在傳遞復(fù)雜數(shù)據(jù)時(shí)更為方便和靈活。

請(qǐng)求的語義:GET請(qǐng)求通常用于獲取或檢索數(shù)據(jù),而POST請(qǐng)求則用于提交數(shù)據(jù)或執(zhí)行某些操作。

緩存機(jī)制:GET請(qǐng)求默認(rèn)開啟瀏覽器緩存機(jī)制,因?yàn)樗闹饕康氖谦@取數(shù)據(jù),而POST請(qǐng)求則默認(rèn)禁用緩存機(jī)制,因?yàn)樗赡軐?duì)服務(wù)器上的資源進(jìn)行修改。

參數(shù)長(zhǎng)度限制:由于GET請(qǐng)求的參數(shù)附加在URL上,因此參數(shù)長(zhǎng)度受到URL長(zhǎng)度的限制。而POST請(qǐng)求的參數(shù)放在請(qǐng)求體中,理論上沒有長(zhǎng)度限制,但實(shí)際上服務(wù)器和客戶端可能會(huì)有最大長(zhǎng)度限制。

3、4、5意味著根據(jù)不同的需求,選擇合適的請(qǐng)求方式是很重要的。

其實(shí)GET帶使用body中傳參,從請(qǐng)求方面講符合了GET請(qǐng)求的語義(獲取和檢索數(shù)據(jù))有能應(yīng)用到混存機(jī)制。從參數(shù)方面講有能突破長(zhǎng)度和數(shù)據(jù)類型的限制,同時(shí)參數(shù)傳遞更安全。

GET使用請(qǐng)求體傳參的合理性

對(duì)于GET請(qǐng)求通過body傳參的情況可以說非常罕見,很多老java都沒見過,也算是給我開了眼了。

根據(jù)以往的經(jīng)驗(yàn),我們約定俗成,GET傳參通過URL拼接,POST傳參通過body傳輸。于是有些HTTP庫(kù)(如OkHttp)是不允許GET請(qǐng)求帶有請(qǐng)求體的,默認(rèn)通過post傳請(qǐng)求體。

雖然官方不推薦這樣做,但是,http(基于tcp的超文本傳輸協(xié)議)并沒有規(guī)定Get請(qǐng)求不能加body。

所以這個(gè)請(qǐng)求自有其合理性。

三、java實(shí)現(xiàn)GET使用請(qǐng)求體傳參請(qǐng)求的技術(shù)選型

在公司封裝好的Http請(qǐng)求方法類中,我們采用的是OkHttp,很不幸的是他不支持GET使用請(qǐng)求體傳參。

于是通過網(wǎng)絡(luò)搜索,我們選定了兩個(gè)方法。一個(gè)是AsyncHttpClient,另一個(gè)是apache.http.client

參考文檔

解決HTTP GET方法調(diào)用帶有body問題

httpclient實(shí)現(xiàn)HttpGet請(qǐng)求傳body的json參數(shù)的

考慮到我們沒有異步請(qǐng)求方面的需求,于是最后選定了apache.http.client

四、完整實(shí)現(xiàn)

1.pom引入關(guān)鍵依賴

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.6</version>
</dependency>

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpcore</artifactId>
  <version>4.5.6</version>
</dependency>

2.定義HttpGet實(shí)體類

這個(gè)實(shí)體類主要供后續(xù)實(shí)現(xiàn)的方法類調(diào)用,可以單獨(dú)作為一個(gè)類,也可以將其作為方法類的子類。

import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;

import java.net.URI;

public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
    private final static String METHOD_NAME = "GET";

    public HttpGetWithEntity() {
        super();
    }

    public HttpGetWithEntity(final URI uri) {
        super();
        setURI(uri);
    }

    HttpGetWithEntity(final String uri) {
        super();
        setURI(URI.create(uri));
    }

    @Override
    public String getMethod() {
        return METHOD_NAME;
    }

}

3.實(shí)現(xiàn)方法類

這里實(shí)現(xiàn)了兩個(gè)方法,都是通過GET請(qǐng)求傳遞請(qǐng)求體數(shù)據(jù)的(請(qǐng)求體數(shù)據(jù)已轉(zhuǎn)換為為JsonString)。

區(qū)別在于一個(gè)是正常返回String類型Response。另一個(gè)是返回文件流并將文件流寫入到文件中。

import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@Slf4j
public class ApacheHttpUitls {
    public static String getResponseByJson(String url, String param, String encoding) throws Exception {
        String body = "";
        //創(chuàng)建httpclient對(duì)象
        CloseableHttpClient client = HttpClients.createDefault();
        HttpGetWithEntity httpGetWithEntity = new HttpGetWithEntity(url);
        HttpEntity httpEntity = new StringEntity(param, ContentType.APPLICATION_JSON);
        httpGetWithEntity.setEntity(httpEntity);
        //執(zhí)行請(qǐng)求操作,并拿到結(jié)果
        CloseableHttpResponse response = client.execute(httpGetWithEntity);
        //獲取結(jié)果實(shí)體
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            //按指定編碼轉(zhuǎn)換結(jié)果實(shí)體為String類型
            body = EntityUtils.toString(entity, encoding);
        }
        //釋放鏈接
        response.close();
        return body;
    }
    
    public static boolean getStreamGetResponse(String url, String requestBody, String outputFilePath) throws Exception {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        CloseableHttpResponse response = null;
        try{

            //創(chuàng)建httpclient對(duì)象
            CloseableHttpClient client = HttpClients.createDefault();
            HttpGetWithEntity httpGetWithEntity = new HttpGetWithEntity(url);
            HttpEntity httpEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
            httpGetWithEntity.setEntity(httpEntity);
            //執(zhí)行請(qǐng)求操作,并拿到結(jié)果
            response = client.execute(httpGetWithEntity);
            //獲取結(jié)果實(shí)體
            HttpEntity entity = response.getEntity();
            log.info("requestUrl: {}, requestBody: {}", url, requestBody);
            if (entity != null) {

                inputStream = entity.getContent();
                Path path = Paths.get(outputFilePath);
                if (!Files.exists(path)) {
                    try {
                        Files.createFile(path);
                    } catch (IOException e) {
                        log.error("File create error ", e);
                        // 處理異常,例如輸出錯(cuò)誤消息或退出程序
                    }
                }
                outputStream = Files.newOutputStream(path);

                byte[] buffer = new byte[1024]; // 可以根據(jù)需要調(diào)整緩沖區(qū)大小
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                log.info("File downloaded and saved at " + outputFilePath);
            }else{
                log.error("Http get Entity is null");
                return false;
            }
            return true;
        } catch (Exception e){
            log.error("File download error ", e);
            return false;
        } finally {
            //釋放鏈接
            if (response != null) response.close();
            if (inputStream != null) inputStream.close();
            if (outputStream != null) outputStream.close();
        }
    }


}

以上就是詳解java如何實(shí)現(xiàn)帶RequestBody傳Json參數(shù)的GET請(qǐng)求的詳細(xì)內(nèi)容,更多關(guān)于java帶RequestBody傳Json參數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java正則表達(dá)式應(yīng)用的實(shí)例代碼

    java正則表達(dá)式應(yīng)用的實(shí)例代碼

    java正則的實(shí)例應(yīng)用分析,大家從下面的代碼中,就能知道java正則的應(yīng)用與寫法
    2008-10-10
  • Java大數(shù)字運(yùn)算之BigInteger

    Java大數(shù)字運(yùn)算之BigInteger

    在Java中提供了大數(shù)字的操作類,即 java.math.BigInteger 類與 java.math.BigDecimal 類。其中,BigInteger 類是針對(duì)大整數(shù)的處理類,這里有Integer 類的解釋,使用方法和實(shí)例,需要的朋友可以參考下。
    2017-08-08
  • 記一次springboot配置redis項(xiàng)目啟動(dòng)時(shí)的一個(gè)奇怪的錯(cuò)誤

    記一次springboot配置redis項(xiàng)目啟動(dòng)時(shí)的一個(gè)奇怪的錯(cuò)誤

    這篇文章主要介紹了spring?boot配置redis項(xiàng)目啟動(dòng)時(shí)的一個(gè)奇怪的錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java字符串查找的方法總結(jié)

    Java字符串查找的方法總結(jié)

    在給定的字符串中查找字符或字符串是比較常見的操作,字符串查找分為兩種形式:一種是在字符串中獲取匹配字符(串)的索引值,另一種是在字符串中獲取指定索引位置的字符,本文給大家總結(jié)了Java字符串查找的方法,需要的朋友可以參考下
    2024-05-05
  • 啟用springboot security后登錄web頁(yè)面需要用戶名和密碼的解決方法

    啟用springboot security后登錄web頁(yè)面需要用戶名和密碼的解決方法

    這篇文章主要介紹了啟用springboot security后登錄web頁(yè)面需要用戶名和密碼的解決方法,也就是使用默認(rèn)用戶和密碼登錄的操作方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Java中通過sftp協(xié)議實(shí)現(xiàn)上傳下載的示例代碼

    Java中通過sftp協(xié)議實(shí)現(xiàn)上傳下載的示例代碼

    在java開發(fā)中遇到需要將linux系統(tǒng)中指定目錄下的文件下載到windows本地的需求,本文就來介紹Java中通過sftp協(xié)議實(shí)現(xiàn)上傳下載,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 用Spring將Service注入到Servlet中的流程步驟

    用Spring將Service注入到Servlet中的流程步驟

    在Java Web開發(fā)中,??Servlet??是一個(gè)非常重要的組件,它用于處理客戶端的請(qǐng)求并生成響應(yīng),而?Spring??框架則是一個(gè)廣泛使用的依賴注入框架,可以幫助開發(fā)者管理應(yīng)用中的對(duì)象及其依賴關(guān)系,本文將介紹如何使用Spring框架將Service層的對(duì)象注入到Servlet中
    2025-01-01
  • SpringCloud-Spring?Boot?Starter使用測(cè)試及問題小結(jié)

    SpringCloud-Spring?Boot?Starter使用測(cè)試及問題小結(jié)

    Spring?Boot?Starter?是在?SpringBoot?組件中被提出來的一種概念、簡(jiǎn)化了很多煩瑣的配置、通過引入各種?Spring?Boot?Starter?包可以快速搭建出一個(gè)項(xiàng)目的腳手架,這篇文章主要介紹了SpringCloud-Spring?Boot?Starter使用測(cè)試,需要的朋友可以參考下
    2022-07-07
  • C++/java 繼承類的多態(tài)詳解及實(shí)例代碼

    C++/java 繼承類的多態(tài)詳解及實(shí)例代碼

    這篇文章主要介紹了C++/java 繼承類的多態(tài)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java打印正弦曲線示例

    java打印正弦曲線示例

    這篇文章主要介紹了java數(shù)組排序示例,需要的朋友可以參考下
    2014-03-03

最新評(píng)論

普陀区| 鄂托克前旗| 通州市| 奉节县| 常熟市| 神池县| 京山县| 安图县| 甘德县| 黄大仙区| 壤塘县| 奇台县| 广东省| 巴东县| 湟源县| 米易县| 恩平市| 满洲里市| 天气| 阿克陶县| 洛阳市| 巨鹿县| 望谟县| 天长市| 南溪县| 厦门市| 峡江县| 曲麻莱县| 辽阳市| 株洲县| 龙陵县| 西城区| 秭归县| 定襄县| 屏东市| 冀州市| 锡林浩特市| 昭觉县| 麦盖提县| 赤城县| 黄冈市|