2017-03-29 57 views
0

我正嘗試在Java上的StackExchange API上執行REST請求,並且我有一些讀取輸出的問題。我做了一個小的代碼示例,看看我是否能正常讀取:使用HttpURLConnection讀取REST請求輸出

package Utils; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class RestClient 
{ 


public static void main(String[] args) 
{ 
    try 
    { 
     URL url = new URL("https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     System.out.println(conn.getResponseCode()); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     String output; 

     while ((output = reader.readLine()) != null) 
     { 
      System.out.println(output); 
     } 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

} 

下面是從網站輸出樣本:

{"items":[{"tags":["c++","templates","covariant"],"owner":{"reputation":3,"user_id":7447292,"user_type":"registered","profile_image":"https://www.gravatar.com/avatar/8979f1b328b9b0f786dec8b4edd514bc?s=128&d=identicon&r=PG&f=1","display_name":"B.Oudot","link":"http://stackoverflow.com/users/7447292/b-oudot"} 

然而,當我打印我的java程序的輸出,我得到狀態碼200,然後剩下的只是一堆非ASCII字符。我是新的REST和JSON。如果可能,我想不使用任何第三方庫。

編輯 我已將我的程序的輸出作爲圖像。

Non Ascii Chatacters

+0

可能更容易使用實際的HTTP庫;也許它是gzipped?由於您沒有提供產出價值的例子,因此不可能說。 –

+0

我編輯我的帖子,通過添加我的輸出圖片。 – Paul

回答

1

你需要使用GZIPInputStream API,當使用GZIP內容編碼。它也是一個輸入流。

我使用gipinput流到您的響應,我看到輸出在json中。

public static void main(String[] args){ 
    try 
    { 
     URL url = new URL("https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     System.out.println(conn.getResponseCode()); 



     GZIPInputStream gzis = new GZIPInputStream(conn.getInputStream()); 
     InputStreamReader reader = new InputStreamReader(gzis); 
     BufferedReader in = new BufferedReader(reader); 

     String readed; 
     while ((readed = in.readLine()) != null) { 
      System.out.println(readed); 
     } 
     //BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     String output; 

     while ((output = in.readLine()) != null) 
     { 
      System.out.println(output); 
     } 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    } 

它爲我工作。

+0

我不認爲這是一個gZip。您可以在瀏覽器中打開此鏈接「https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow」。 – Paul

+1

@Paul \t事實證明,瀏覽器處理un-gzipping內容。這是網絡管理工作的一種。例如,如果您在瀏覽器中打開您問題的鏈接並查看網絡請求,您會看到:Content-Encoding:gzip。所以。 –

+0

非常感謝。有用。 – Paul