記錄環信IM使用restful介面時遇到的傳送PUT請求失敗的問題

大星說爬蟲發表於2023-12-29

問題發生在環信修改使用者密碼的介面上,介面如下


PUT https://{host}/{org_name}/{app_name}/users/{username}/password

1.





token是已經存在於redis中的,這裡我的程式碼中是直接取的。


@Override

    public boolean modifyPassword (String username, String password) throws IOException {

        HashMap<String,String> map =new HashMap<> ();

        URL url = new URL (" + host + "/" + orgName + "/" + appName + "/users/" + username + "/password");

        HttpURLConnection connection = (HttpURLConnection) url.openConnection ();

        // 設定請求方法為PUT

        connection.setRequestMethod ("PUT");


        // 設定請求頭部資訊

        connection.setRequestProperty("Accept", "application/json");

        String token = (String) redisTemplate.opsForValue ().get (RedisKeyConfig.IM_TOKEN);

        connection.setRequestProperty ("Authorization","Bearer"+token);

        // 開啟輸出流,寫入請求體資料

        connection.setDoOutput(true);

        OutputStream outputStream = connection.getOutputStream();

        String requestBody = "{\"newpassword\": \""+password+"\"}";

        outputStream.write(requestBody.getBytes());

        outputStream.flush();


        // 傳送請求並獲取響應

        int responseCode = connection.getResponseCode();

        // 讀取響應資料

        BufferedReader reader = new BufferedReader(new InputStreamReader (connection.getInputStream()));

        String line;

        StringBuilder response = new StringBuilder();

        while ((line = reader.readLine()) != null) {

            response.append(line);

        }

        reader.close();

        String substring = response.substring (1, response.length () - 1);

        System.out.println (substring);

        connection.disconnect();

        if(substring.contains ("set user password")){

        return true;

        }

        return false;

    }

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

36.

37.

按理來說,到這裡請求是符合環信介面要求的,但是神奇的事情發生了,這裡顯示傳送了一個get請求,但我設定的是put請求。這次請求不出意外的返回了錯誤碼401。






本以為是請求方式設定沒有成功,亦或者是connection.setRequestProperty ("Authorization","Bearer "+redisTemplate.opsForValue ().get (RedisKeyConfig.IM_TOKEN));的寫法導致token有問題。


在排查一圈後注意到了AI的一句話。






加上空格後問題果然解決了。


然後瞭解了一下,Bearer後面必須帶空格,然後才能拼接token,至於原因,沒有找到可引用的內容。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70030722/viewspace-3002113/,如需轉載,請註明出處,否則將追究法律責任。

相關文章