从OkHttp转到HttpURLConnection

问题描述 投票:0回答:1

出于库兼容性问题的原因,我想使用HttpURLConnection来调用API上的请求。这是我与OkHttp一起使用以获取令牌访问的代码:

private void getAccessToken(){

        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody requestBody = new FormEncodingBuilder().add("grant_type", "authorization_code")
                .add("client_id", "1568xxxxxxxxxxxxxxxxxjro.apps.googleusercontent.com")
                .add("client_secret", "AMe0xxxxxxxxxxxx")
                .add("redirect_uri", "")
                .add("code", serverCode)
                .build();
        Request request = new Request.Builder()
                .url("https://www.googleapis.com/oauth2/v4/token")
                .post(requestBody)
                .build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                Log.i("severcode","failure");
            }

            @Override
            public void onResponse(Response response) throws IOException {
                try {
                    JSONObject jsonObject = new JSONObject(response.body().string());
                    token = jsonObject.optString("access_token");
                    tokenExpired = SystemClock.elapsedRealtime() + jsonObject.optLong("expires_in") * 1000;
                    Log.i("severcode",String.valueOf(token));
                    createGooglePhotosClient();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

    }

所以我想知道如何获得与requestbody等效的值,以便将其传递给setRequestProperty()?

感谢您的帮助

java android httpurlconnection okhttp
1个回答
0
投票

请求主体不是请求属性(标头),它是请求的主体,没有OkHttp或其他支持库,您必须自己格式化它,对任何需要编码的特殊字符进行编码等。

String requestBody = "grant_type=authorization_code&client_id=1568xxxxxxxxxxxxxxxxxjro.apps.googleusercontent.com&" 
      + "client_secret=AMe0xxxxxxxxxxxx&redirect_uri=&code=" + serverCode + "\n\n";
byte[] requestBodyBytes = requestBody.getBytes("UTF-8");

一旦有了请求主体,就将其写入连接的输出流。例如:

connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
out = connection.getOutputStream();
out.write(requestBodyBytes)
out.flush();
© www.soinside.com 2019 - 2024. All rights reserved.