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

RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式

 更新時(shí)間:2023年07月06日 17:08:16   作者:詞窮墨盡  
這篇文章主要介紹了RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)

  /**
     * 根據(jù)get方式請(qǐng)求接口
     * @param url
     * @param map
     * @param restTemplate
     * @return
     */
    public static JSONObject requestByGet(String url,HashMap<String,Object> map, RestTemplate restTemplate,HttpHeaders headers){
        // header填充
        HttpEntity<MultiValueMap<String,Object>> request = new HttpEntity(null,headers);
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
        ResponseEntity responseEntity;
        //如果存在參數(shù)
        if(!map.isEmpty()){
            for (Map.Entry<String,Object> e:
                    map.entrySet()) {
                //構(gòu)建查詢參數(shù)
                builder.queryParam(e.getKey(),e.getValue());
            }
            //拼接好參數(shù)后的URl//test.com/url?param1={param1}&param2={param2};
            String  reallyUrl=builder.build().toString();
            responseEntity  =restTemplate.exchange(reallyUrl,HttpMethod.GET,request,String.class);
        }else{
            responseEntity=restTemplate.exchange(url,HttpMethod.GET,request,String.class);
        }
       return getJSONObjectForResponseEntity(responseEntity);
    }

RestTemplate請(qǐng)求參數(shù)傳遞問(wèn)題

問(wèn)題

使用RestTemplate傳遞參數(shù)的時(shí)候,RestTemplate默認(rèn)傳遞的是json格式,將參數(shù)放在請(qǐng)求體中,這就導(dǎo)致使用@RequestParam接收不到參數(shù)。下面測(cè)試集中參數(shù)傳遞的方式

測(cè)試方法

  • 1.先重現(xiàn)錯(cuò)誤,使用RestTemplate傳遞json,同時(shí)使用@RequestParam接收參數(shù).
  • 2.更改RestTemplate參數(shù)傳遞方式,將參數(shù)使用占位符在請(qǐng)求行拼接.
  • 3.測(cè)試使用@RequestBody接收請(qǐng)求體中的數(shù)據(jù)(對(duì)象/集合/字符串/json數(shù)據(jù)).

測(cè)試

構(gòu)造幾個(gè)接口

/**
 * 測(cè)試restTemplate的數(shù)組型(List)數(shù)據(jù)的傳遞
 */
@RestController
public class UserController {
    /**
     * 接收一個(gè)json格式的字符串    數(shù)組轉(zhuǎn)換為json字符串傳遞
     */
    @RequestMapping(value = "/test01")
    public String getRest01(@RequestParam("userList")String userList) {
        //轉(zhuǎn)為list
        List<User> userList1 = JSONArray.parseArray(userList, User.class);
        for (User user : userList1) {
            System.out.println(user);
        }
        return "11111111111";
    }
    /**
     * 測(cè)試直接傳遞單個(gè)對(duì)象
     */
    @RequestMapping(value = "/test02")
    public String getRest02(@RequestBody User user) {
        System.out.println(user);
        return "2222222222222";
    }
    /**
     *測(cè)試使用list<>接收數(shù)組型的參數(shù)
     */
    @RequestMapping(value = "/test03")
    public String getRest03(@RequestBody List<User> userList) {
        System.out.println(userList);
        return "333333333333";
    }
    /**
     * 使用String 接收請(qǐng)求體中數(shù)據(jù)
     */
    @RequestMapping(value = "/test04")
    public String getRest04(@RequestBody String userList) {
        //轉(zhuǎn)為list
        List<User> userList1 = JSONArray.parseArray(userList, User.class);
        for (User user : userList1) {
            System.out.println(user);
        }
        return "444444444444444";
    }
    /**
     * 使用JSONArray接收請(qǐng)求體中的數(shù)據(jù)
     */
    @RequestMapping(value = "/test05")
    public String getRest05(@RequestBody JSONArray jsonArray, HttpServletRequest request) {
        //獲取請(qǐng)求頭中的數(shù)據(jù)
        String key = request.getHeader("key");
        System.out.println(key);
        //轉(zhuǎn)為list
        List<User> userList = JSONArray.parseArray(jsonArray.toJSONString(), User.class);
        for (User user : userList) {
            System.out.println(user);
        }
        return "55555555555555";
    }
}

使用單元測(cè)試測(cè)試接口

class ApplicationTests {
    private RestTemplate restTemplate = new RestTemplate();
    //構(gòu)建兩個(gè)使用的對(duì)象并使用list封裝起來(lái)
    private List<User> userList = new ArrayList<>();
    private User oneUser;
    private User twoUser;
    {
        //第一個(gè)對(duì)象
        oneUser = new User();
        oneUser.setName("第一個(gè)用戶");
        oneUser.setAge("第一個(gè)年齡");
        oneUser.setAddress("第一個(gè)地址");
        //第二個(gè)對(duì)象
        twoUser = new User();
        twoUser.setName("22222222第二個(gè)用戶");
        twoUser.setAge("2222222第二個(gè)年齡");
        twoUser.setAddress("222222第二個(gè)地址");
        //添加進(jìn)list
        userList.add(oneUser);
        userList.add(twoUser);
    }
    /*
     * 當(dāng)服務(wù)端使用@RequestParam("tableList")String tableList這種方式時(shí)
     * 方法異常:HttpClientErrorException$BadRequest: 400 Bad Request
     * 原因:無(wú)法使用@RequestParam識(shí)別參數(shù)中的json格式的
     * */
    @Test
    void test01() {
        String url = "http://127.0.0.1:8080/test01";
        //json格式的字符串
        String jsonString = JSON.toJSONString(userList);
        Map<String, String> map = new HashMap<>();
        map.put("userList", jsonString);
        String s = restTemplate.postForObject(url, map, String.class);
        System.out.println(s);
    }
    /*
     * 當(dāng)服務(wù)端使用@RequestParam("tableList")String tableList這種方式時(shí),改請(qǐng)求方式會(huì)成功
     * 改變:使用了postForEntity方法(這個(gè)方法可以傳遞更多的請(qǐng)求信息,比如請(qǐng)求頭等)
     * 使用的占位符的方式拼接json字符串,  在第一個(gè)方法參數(shù)中,最后的參數(shù)Object...是一個(gè)可變形參,可以傳遞多個(gè)參數(shù),位置從1開(kāi)始
     * 原因:restTemplate默認(rèn)的是json格式的參數(shù),會(huì)在請(qǐng)求體中放著數(shù)據(jù),而@RequestParam只能獲取請(qǐng)求行中的參數(shù)
     * 將參數(shù)改在請(qǐng)求行發(fā)送就能接收到了.
     * */
    @Test
    void test02() {
        //使用占位符的方式
        String url = "http://127.0.0.1:8080/test01?userList={1}";
        String jsonString = JSON.toJSONString(userList);
        //使用占位符拼接參數(shù)
        //連接(帶有占位符的)  /  HttpEntity對(duì)象(暫時(shí)不用,后邊會(huì)有)  /  返回值  /  拼接的數(shù)據(jù)
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, null, String.class, jsonString);
        System.out.println(responseEntity.toString());
    }
    /*
    * 當(dāng)服務(wù)端使用(@RequestBody User user)這種方式時(shí),會(huì)成功
    * @RequestBody 將會(huì)從請(qǐng)求體(body)中取數(shù)據(jù),此時(shí)可以取到已經(jīng)轉(zhuǎn)為json格式的User對(duì)象(resttemplate會(huì)自動(dòng)轉(zhuǎn))
    * 但是當(dāng)傳遞的是數(shù)組型的數(shù)據(jù)時(shí)(List),服務(wù)端又改怎么樣接收呢,使用test04測(cè)試一下.
    * */
    @Test
    void test03() {
        //使用服務(wù)端的test02接口
        String url = "http://127.0.0.1:8080/test02";
        //測(cè)試只傳遞一個(gè)對(duì)象,   使用httpEntity來(lái)封裝一下對(duì)象.
        HttpEntity<User> httpEntity = new HttpEntity<>(oneUser);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
        System.out.println(responseEntity.toString());
    }
    /*
    * 傳遞的是數(shù)組型的數(shù)據(jù)的時(shí)候,服務(wù)端可以使用List<>這種形式來(lái)接收,也會(huì)成功
    * */
    @Test
    void test04() {
        //使用服務(wù)端的test03接口,用list<>接收
        String url = "http://127.0.0.1:8080/test03";
        //測(cè)試傳遞一個(gè)list對(duì)象
        HttpEntity<List<User>> httpEntity = new HttpEntity<>(userList);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
        System.out.println(responseEntity.toString());
    }
    /*
     * 傳遞的是數(shù)組型的數(shù)據(jù)的時(shí)候,服務(wù)端也可以使用String來(lái)接收json型的數(shù)據(jù)
     * */
    @Test
    void test05() {
        //使用服務(wù)端的test04接口,用String接收
        String url = "http://127.0.0.1:8080/test04";
        //測(cè)試傳遞一個(gè)list對(duì)象
        HttpEntity<List<User>> httpEntity = new HttpEntity<>(userList);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
        System.out.println(responseEntity.toString());
    }
    /*
     * 傳遞的是數(shù)組型的數(shù)據(jù)的時(shí)候,服務(wù)端也可以使用JsonArray來(lái)接收
     * */
    @Test
    void test06() {
        //使用服務(wù)端的test04接口,用JsonArray接收
        String url = "http://127.0.0.1:8080/test05";
        //傳遞的參數(shù)的同時(shí),自定義請(qǐng)求頭
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("key","value");
        HttpEntity<List<User>> httpEntity = new HttpEntity<>(userList,httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
        System.out.println(responseEntity.toString());
    }
    /*
    * 總結(jié)一下:
    * 使用RestTemplate遠(yuǎn)程調(diào)用接口的時(shí)候,會(huì)默認(rèn)將數(shù)據(jù)放在請(qǐng)求體中(body)
    * 而使用@RequestBody才能接收請(qǐng)求體中的數(shù)據(jù).
    * @RequestParam只能接收請(qǐng)求行中的參數(shù)
    * 根據(jù)位置選擇使用的注解
    *
    * postForEntity 方法可以自定義請(qǐng)求頭,以及進(jìn)行請(qǐng)求行的參數(shù)拼接,功能全
    * */
}

在這里插入圖片描述

心得

使用RestTemplate遠(yuǎn)程調(diào)用接口的時(shí)候,會(huì)默認(rèn)將數(shù)據(jù)放在請(qǐng)求體中(body)

使用@RequestBody才能接收請(qǐng)求體中的數(shù)據(jù).

@RequestParam只能接收請(qǐng)求行中的

服務(wù)端應(yīng)該根據(jù)參數(shù)位置選擇使用的注解

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot依賴和代碼分開(kāi)打包的實(shí)現(xiàn)步驟

    SpringBoot依賴和代碼分開(kāi)打包的實(shí)現(xiàn)步驟

    本文主要介紹了SpringBoot依賴和代碼分開(kāi)打包的實(shí)現(xiàn)步驟,,這種方法將依賴和代碼分開(kāi)打包,一般更新只有代碼修改,Pom文件是不會(huì)經(jīng)常改動(dòng)的,感興趣的可以了解一下
    2023-10-10
  • Mybatis返回int或者Integer類型報(bào)錯(cuò)的解決辦法

    Mybatis返回int或者Integer類型報(bào)錯(cuò)的解決辦法

    這篇文章主要介紹了Mybatis返回int或者Integer類型報(bào)錯(cuò)的解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • java list去重操作實(shí)現(xiàn)方式

    java list去重操作實(shí)現(xiàn)方式

    本文主要介紹了java list 去重的方法,其中有帶類型寫法和不帶類型寫法,并舉例測(cè)試,具有一定參考借鑒價(jià)值,希望能對(duì)有需要的小伙伴有所幫助
    2016-07-07
  • 使用java?實(shí)現(xiàn)mqtt兩種常用方式

    使用java?實(shí)現(xiàn)mqtt兩種常用方式

    在開(kāi)發(fā)MQTT時(shí)有兩種方式一種是使用Paho Java 原生庫(kù)來(lái)完成,一種是使用spring boot 來(lái)完成,這篇文章主要介紹了使用java?實(shí)現(xiàn)mqtt兩種方式,需要的朋友可以參考下
    2022-11-11
  • Java常見(jiàn)踩坑記錄之異常處理

    Java常見(jiàn)踩坑記錄之異常處理

    程序運(yùn)行時(shí)發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常,下面這篇文章主要給大家介紹了關(guān)于Java常見(jiàn)踩坑記錄之異常處理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Springboot 整合 Dubbo/ZooKeeper 實(shí)現(xiàn) SOA 案例解析

    Springboot 整合 Dubbo/ZooKeeper 實(shí)現(xiàn) SOA 案例解析

    這篇文章主要介紹了Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例,需要的朋友可以參考下
    2017-11-11
  • Java中ShardingSphere 數(shù)據(jù)分片的實(shí)現(xiàn)

    Java中ShardingSphere 數(shù)據(jù)分片的實(shí)現(xiàn)

    其實(shí)很多人對(duì)分庫(kù)分表多少都有點(diǎn)恐懼,我們今天用ShardingSphere 給大家演示數(shù)據(jù)分片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java中方法重寫與重載的區(qū)別

    Java中方法重寫與重載的區(qū)別

    大家好,本篇文章主要講的是Java中方法重寫與重載的區(qū)別,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • IntelliJ IDEA 2019.1.1 for MAC 下載和注冊(cè)碼激活教程圖解

    IntelliJ IDEA 2019.1.1 for MAC 下載和注

    這篇文章主要介紹了IntelliJ IDEA 2019.1.1 for MAC 下載和注冊(cè)碼激活,教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • mybaits-spring的實(shí)現(xiàn)方式

    mybaits-spring的實(shí)現(xiàn)方式

    這篇文章主要介紹了mybaits-spring的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論

枣阳市| 周口市| 高安市| 噶尔县| 南汇区| 万宁市| 新乡市| 盘山县| 宁德市| 黄陵县| 盘锦市| 荆州市| 道真| 恩施市| 大洼县| 晋中市| 郯城县| 台南市| 永清县| 依安县| 高青县| 永顺县| 禄丰县| 宽甸| 乌海市| 蒙城县| 荆门市| 泗阳县| 日照市| 巫溪县| 尖扎县| 张家川| 依安县| 涞水县| 锡林郭勒盟| 增城市| 阜南县| 海门市| 鸡西市| 屏边| 民丰县|