类型为 Authorization = bearer token 的 GET 请求的 401 未授权错误

401 unauthorized error for GET request with type Authorization = bearer token

我正在使用 "Authorization" 作为 header 附加不记名令牌发出 HttpGet 请求。我一直收到 401 未授权错误。

我试过改造,但没有用,所以我恢复到基本的 HTTP 客户端。然后经过大量研究发现DefaultHttp存在一些错误。所以我改成了HTTPUrlConnection。即使做了所有这些,我仍然收到未经授权的 401 错误。我在这里可能做错什么?因为这个错误仍然存​​在,我决定坚持使用 HTTPUrlConnection 或 DefaultHTTP 并远离图书馆。

这是我使用 HttpUrlConnection 的代码

        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection)
                            obj.openConnection();
        con.setRequestMethod("GET");

        String authString = "Bearer" + accessToken;
        con.setRequestProperty("Authorization", authString);

        int responseCode = con.getResponseCode();

        if (responseCode == HttpURLConnection.HTTP_OK) { // success
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));
            String inputLine;
            response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

        } else {
            System.out.println("GET request not worked");
        }

这是我的 DefaultHttp 请求

        StringBuilder builder = new StringBuilder();
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGetRequest = new HttpGet(url);
        httpGetRequest.addHeader("Authorization","Bearer"+accessToken);
        try {
            HttpResponse response = client.execute(httpGetRequest);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new 
                InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
            }

Bearer cus 之后添加一个空格,因为它表示您将 Bearer 与标记作为一个字符串连接

请使用快速 Android 网络库非常易于使用,您可以在 5 分钟内实现您的逻辑。所以请至少尝试一下。下面是 link 到图书馆:

https://github.com/amitshekhariitbhu/Fast-Android-Networking

问题已解决。我尝试使用 retrofit 和 defaultHttpClient 但由于某些 cookie 问题,两者都对我不起作用。但是使用 OKHttpClient 很简单,我能够访问服务器并获得响应。

    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url(mURL)
            .addHeader("Authorization", String.format("Bearer %s", bearerToken))
            .build();

        Response response = client.newCall(request).execute();
        return response.body().string();