2017-10-18 87 views
1

你好,我正在尝试基于Java和apache Oltu库为堆栈交换api设置授权oauth客户端。堆栈交换oauth响应无法读取

我收到的响应看起来像这样,当在控制台打印时 u n 0 “+ t k lۄ {BԨM s h W # ڇWj @ٹ F *P N р =ѹ \k

在浏览器中,响应很好我的问题与 Http request to stackexchange api returns unreadable json 完全相似,但是接受的答案表明响应流是gziped JSON。当我尝试解压缩响应时,我的程序显示“Not in GZIP format”格式,我尝试了以下操作: 新的GZIPInputStream(响应)

如果我转换的响应为十六进制我得到如下:

0x1FEFBFBD080000000000040075EFBFBDEFBFBD6EEFBFBD3010EFBFBD5FEFBFBDEFBFBD222B140CEFBFBDEFBFBDEFBFBD7455EFBFBDEFBFBD6CEFBFBDEFBFBD2A6BEFBFBD07EFBFBD156C13DB84EFBFBDEFBFBD7B0742D4A84DEFBFBDEFBFBDEFBFBDEFBFBD73EFBFBD68EFBFBD57EFBFBD23EFBFBDEFBFBDDA8757EFBFBD086A40D9B9EFBFBD462A50EFBFBDEFBFBDEFBFBDEFBFBDEFBFBD1216EFBFBDEFBFBDEFBFBDEFBFBDEFBFBD3C61EFBFBD1B1505D78441EFBFBDDF95EFBFBDEFBFBDCE8B2627EFBFBDEFBFBD4433EFBFBD6E45EFBFBDEFBFBD610CEFBFBDEFBFBD1142EFBFBDEFBFBD29EFBFBD6B545241EFBFBD44455EEFBFBD4DEFBFBD45797052EFBFBD10EFBFBD69C99B42E49C8BEFBFBD79EFBFBDEFBFBD08513B2BEFBFBD0B58EFBFBDEFBFBD22EFBFBDEFBFBDEFBFBD33EFBFBD3CEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD71365EEFBFBD600BEFBFBDEFBFBD1748EFBFBDEFBFBD0F616DEFBFBDEFBFBDEFBFBDEFBFBDDBB5EFBFBD7321442EEFBFBD66EFBFBD3C0 7EFBFBD32EFBFBD13EFBFBDEFBFBD6BD0813CEFBFBD6207EFBFBD1756EFBFBDCDA9EFBFBDEFBFBD2DEFBFBD14EFBFBDEFBFBD35EFBFBD6D1BEFBFBD3B66EFBFBD1FEFBFBDEFBFBDEFBFBDEFBFBD1D7A0376EFBFBDEFBFBD515BEFBFBDEFBFBD2E314EEFBFBD4DEFBFBD10EFBFBD7B72EFBFBD30EFBFBDEFBFBDEFBFBDCE9974EFBFBD0FE9A1BD67474CCD9377EFBFBD1E516A03037E5059EFBFBDEFBFBD76EFBFBDEFBFBD0211EFBFBD2EEFBFBD16EFBFBD45EFBFBDEFBFBDEFBFBDEFBFBD2EEFBFBD38EFBFBD42EFBFBD05EFBFBD725E6156EFBFBDE9B1A8EFBFBDEFBFBD7B38677973EFBFBDEFBFBD5AEFBFBDEFBFBDEFBFBD73EFBFBDC69FEFBFBDEFBFBD68EFBFBDEFBFBD611A61EFBFBD16EFBFBD36E8A38DEFBFBDCF845D20EFBFBD4BEFBFBDEFBFBDEFBFBDEFBFBD797611EFBFBDEFBFBD5FEFBFBD164EEFBFBDEFBFBDD180EFBFBDEFBFBD0EEFBFBD3DD1B9EFBFBD015C1A6BEFBFBDEFBFBD020000

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

回答

0

你可以试试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> 
+1

谢谢您。我会试试这个。截至目前,我写了一个像这样的直接http调用 – Haramoz

+1

我注意到你不需要将url作为url http请求的一部分。对我而言,我似乎需要它。这是错的吗? 截至目前,我写了一个像这样的直接http调用。哦,不得不添加代码作为答案。无法添加为评论。太长。 – Haramoz

+0

这取决于您使用的是哪个端点。您可以在以下链接中看到一些端点需要该密钥:https://api.stackexchange.com/docs –

1

截至目前我写了一个直接HTTP调用这样// HTTP GET请求 私人字符串sendGet(字符串的accessToken)抛出异常{

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; 
    }