【问题标题】:Getting content from http request android, conent ill-formed从http请求android获取内容,内容格式错误
【发布时间】:2020-03-26 09:31:06
【问题描述】:

我正在尝试使用OAuth2 方法连接到 twitter API 以获取不记名令牌。 我正在使用AsyncTask 拨打 Twitter。我的请求似乎被接受并返回error code 200,但是当我尝试读取应该包含我想要的令牌的内容时,但格式很奇怪,以及响应的内容长度。

我是按照这个link来构建的。

这是我用来发出请求的AsyncTask

private class RequestBearerTockenTask extends AsyncTask<String, Integer, String> {
    @Override
    protected String doInBackground(String... string) {

        // On récupère les keys passées en paramètre
        String consumerKey = string[0];
        String secretKey = string[1];

        // On encode en base64 le bearerToken en accord avec la doc twitter
        String base64encodedBearerToken = Base64.encodeToString((consumerKey + ":" + secretKey).getBytes(), Base64.NO_WRAP);

        // Variables locales de la fonction
        String bearerTocken = "";
        URL url = null;
        HttpURLConnection urlConnection = null;

        try {
            // On formate la requete HTTP
            url = new URL("https://api.twitter.com/oauth2/token");
            urlConnection = (HttpURLConnection) url.openConnection();

            urlConnection.setRequestMethod("POST");
            urlConnection.setRequestProperty("Host", "api.twitter.com");
            urlConnection.setRequestProperty("User-Agent", " My Twitter App v1.0.23");
            urlConnection.setRequestProperty("Authorization", "Basic " + base64encodedBearerToken);
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            urlConnection.setRequestProperty("Content-Length", "29");
            urlConnection.setRequestProperty("Accept-Encoding", "gzip");

            String requestBody =  "grant_type=client_credentials";
            byte[] outputInBytes = requestBody.getBytes("UTF-8");
            OutputStream os = urlConnection.getOutputStream();
            os.write( outputInBytes );
            os.close();

            // On lit l'entete de la reponse
            int responseCode = urlConnection.getResponseCode();

            switch (responseCode) {
                case 200:
                case 201:

                    BufferedReader rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                    String line;
                    while ((line = rd.readLine()) != null) {
                        bearerTocken += line;
                    }
                    break;
                default:
                    bearerTocken = "";
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bearerTocken;
    }
}

最后的bearerToken是这样的:

����������������V*��N͋/�,HU�RJJM,JR�QJLNN-.�K�����/�rW03��5� �+81��$���=?[��)�ɱ���B�إа�2�)+����$�2�� ����?����?7�;�0�2�995=�-=/$$�"�30T�����������9�뇛������

根据文档,内容长度为 149 而不是 140。

您知道为什么我会收到这样的回复吗?

【问题讨论】:

  • 如果你是urlConnection.setRequestProperty("Accept-Encoding", "gzip");支持gzip编码,你在哪里解码响应内容?
  • 就是这样,我只是按照要求没有考虑,非常感谢

标签: java android twitter-oauth


【解决方案1】:

如果您不解码/处理gzip 压缩,为什么要使用它?内容以gzip 编码。在使用它之前,您需要对其进行解码。我建议您在调用 API 时不要使用该编码。删除代码行urlConnection.setRequestProperty("Accept-Encoding", "gzip");,一切都应该工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多