Java 堆栈交换oauth响应不可读

Java 堆栈交换oauth响应不可读,java,oauth,gzip,stackexchange-api,oltu,Java,Oauth,Gzip,Stackexchange Api,Oltu,您好,我正在尝试为堆栈交换api设置一个基于Java和apache Oltu库的授权oauth客户端 在控制台中打印时,我收到的响应如下所示 U��N�0���"+���屠��L��*K��lۄ��{BԨM����s�H�W�#��ڇWj@ٹ�F*P�����������N��р���=ѹ�\K�� 在浏览器中,响应以可读的格式很好地打印出来 但正如公认的答案所示,响应流是GZIP JSON。当我尝试解压缩响应时,我的程序会说“不是GZIP格式”。我尝试了以下内容: 新GZIPInputSt

您好,我正在尝试为堆栈交换api设置一个基于Java和apache Oltu库的授权oauth客户端

在控制台中打印时,我收到的响应如下所示 U��N�0���"+���屠��L��*K��lۄ��{BԨM����s�H�W�#��ڇWj@ٹ�F*P�����������N��р���=ѹ�\K��

在浏览器中,响应以可读的格式很好地打印出来 但正如公认的答案所示,响应流是GZIP JSON。当我尝试解压缩响应时,我的程序会说“不是GZIP格式”。我尝试了以下内容: 新GZIPInputStream(响应)

如果我将响应转换为十六进制,我将得到以下结果:

0x1EFBFBD08000000000040075EFBFBDFBD6EEFBD310EFBFBD5FEFBDFBD22B2B140CEBFBDEFBFBD7455EFBFBDFBD6CEBFBDFBD6CEBFBDFBD2A6BEFBBD07EFBFBD156C13DB84EFBFBDFBD7B0744A84DEFBFBDFBDFBDD73EFBFBD68EFBFBD57EFBFBD23EFBFBDFBBDFBD87EFBFBDD87EFBFBD086A40D9EFBFBFBDB462AFBFBDFBDB161EFBFBDBFBFBFBDB121EFBFBDBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBDD6BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBDB16BFBD1B1505D78441EFBFBDF95EFBFBDEFBDFBDCE8B2627EFBFBDFBD4433EFBFBD6E45EFBFBDFBD610EFBFBDFBFBFBD1142EFBFBDFBFBDFBD29EFBFBD6B545241EFBFBD4445EFBFBD45797052EFBFBD10EFBFBD69C99B42E49C8EFBFBD79EFBFBDBDD08513B2BEBFBD0B50B58EFBFBDFBD22EFBFBDFBDBD32EFBFBDFBFBD33EFBFBDFBD7EFBFBDFBD757EFBFBDBFBDFBD7EFBFBDFBD74BFBDBFBFBFBFBFBDD6BFBFBFBFBFBFBDD7BFBFBDD7BFBFBFBFBFBFBFBFBFBFBDD8BFBFBFBFBFBFBFBFBDD8BFBDD8BFBFBFBFBFBDDFBD0F616EFBFBDFBFBDFBFBDFBDDBB5EFBFBD7321442EEFBD66EFBFBD3C07EFBFBD32EFBFBD13EFBFBDFBD6BD0813CEBFBD6207EFBFBD1756EFBFBDCDA9EFBFBDFBDD2EFBFBD14EFBFBDD35EFBFBD6D1BEBFBD3B66EFBFBD1EFBFBFBDFBDBD17A0376EFBFBDFBBDD515BEBFBDBDFBBDFBBDD10EFBFBDD10EFBFBDD74EFBFBDBFBD499EFBFBD074EFBFBD074EFBFBD074EFBFBD074BFBD074EFBFBD074EFBFBD074EFBFBD074EFBFBFBD074BFBFBFBD074BFBFBFBFBFBFBFBFBFBD074BFBFBFBFBFBFBD074BFBFBD074BFBFBFBD494977EFBFBD1E516A03037E5059EFBFBDEFBDFBD76EFBFBDEFBDFBD0211EFBBD2EEFBD16EFBFBD45EFBFBDFBFBDEFBFBDFBD2EEFBD38EFBFBD42EFBFBD05EFBFBD725E6156EFBFBDE9B1A8EFBFBDEDFBD7B3867773EFBFBDFBD5AEFBDFBDFBDBD73EFBFBDC69FEFBBDBDB68EFBFBDFBDD611EFBFBD368EFBFBDE8EFBFBDFBDD8EFBDD7B367797BFBDFbD5EFBDFbFbD7BFBDFbFbFbD6FbFbFbD6FbFbD6FbFbFbFbD6FbFbFbD6FbFbD6FbFbFbD6FbFbFbFbFbD6EEFBFBDEFBFBDD180EFBFBDFBD0EEFBFBD3DD1B9EFBFBD015C1A6EFBFBDFBD020000


所以我现在的问题是,我不能直接读取JSON,也不能使用GZIP解压。我现在可以做什么来处理数据?有什么想法吗?谢谢您的时间。

您可以尝试OkHttp。下面是一个对我有效的示例。它自动为我解决了解压问题

    UriComponents uriComponents =
            UriComponentsBuilder.newInstance()
                    .scheme("https")
                    .host("api.stackexchange.com")
                    .path("/2.2/users")
                    .queryParam("order", "desc")
                    .queryParam("sort", "reputation")
                    .queryParam("inname", fullName)
                    .queryParam("site", "stackoverflow")
                    .build()
                    .encode();

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url(uriComponents.toUriString())
            .get()
            .addHeader("cache-control", "no-cache")
            .build();

    Response response = client.newCall(request).execute();
    return new JSONObject(response.body().string());
Maven依赖

    <dependency>
        <groupId>com.squareup.okhttp</groupId>
        <artifactId>okhttp</artifactId>
        <version>2.7.5</version>
    </dependency>

com.squareup.okhttp
okhttp
2.7.5

到现在为止,我编写了一个直接http调用,如下所示//http GET请求 私有字符串sendGet(字符串访问令牌)引发异常{

    String url = "https://api.stackexchange.com/2.2/me?site=stackoverflow&key="key"((&access_token=";
    url = url + accessToken;
    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    con.setRequestMethod("GET");      
    int responseCode = con.getResponseCode();
    if(responseCode == 200){
        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);
        //System.out.println(con.getContentEncoding());
        //System.out.println(con.getContentType());

        GZIPInputStream gp = new GZIPInputStream(con.getInputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(gp));

        StringBuffer response = new StringBuffer();
        String line;
        while ((line = br.readLine()) != null) {
            response.append(line);
        }

        br.close();

        System.out.println(response.toString());
        return response.toString();
    }
    else{
        return null;
    }

谢谢。我会尝试一下。到现在为止,我写了一个直接的http调用。我注意到你不必将你的密钥作为url http请求的一部分连接起来。对我来说,我似乎需要它。它错了吗?到现在为止,我写了一个这样的直接http调用。哦,必须添加代码作为答案。不能添加为注释。太长了。这取决于哪个e您正在使用的ndpoint。您可以在以下链接中看到某些端点需要该键: