2016-11-05 44 views
0

我正在嘗試使用Twitch.tv API進行身份驗證並收到訪問令牌,但我無法查看響應的正文。爲什麼我的Java程序在試圖從SSL的Twitch.tv API獲取令牌時掛起?

public static void getToken(String body) { 

    try { 
    SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    SSLSocket socket = (SSLSocket) sf.createSocket("api.twitch.tv", 443); 

    PrintWriter pw = new PrintWriter(socket.getOutputStream()); 

    pw.print("POST /kraken/oauth2/token HTTP/1.1\r\n"); 
    pw.print("Host: api.twitch.tv\r\n"); 
    pw.print("Content-Type: application/x-www-form-urlencoded\r\n"); 
    pw.print("Content-Length: 189\r\n"); 
    pw.print("Client-ID: [myClientIDHere]\r\n\r\n"); // Edited it out when posting online. 
    pw.print(body); 
    pw.flush(); 

    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    String line; 

     while ((line = br.readLine()) != null) { 
      System.out.println(line);    
     } 

    br.close(); 

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

} 

這是我迄今爲止的代碼。我得到的輸出是:

HTTP/1.1 400 Bad Request 
Accept-Ranges: bytes 
Access-Control-Allow-Headers: 
Access-Control-Allow-Methods: 
Access-Control-Allow-Origin: * 
Age: 0 
Cache-Control: no-cache, no-store, must-revalidate 
Content-Type: application/json; charset=utf-8 
Date: Sat, 05 Nov 2016 07:22:35 GMT 
Pragma: no-cache 
Server: nginx 
Set-Cookie: unique_id=92143f722dd21b4e; domain=.twitch.tv; path=/; expires=Thu, 05-Nov-2026 07:22:35 GMT 
Set-Cookie: _twitch_session_id=8c5ec350cad83ea4150e1dc05be029f3; domain=.twitch.tv; path=/; expires=Sat, 05-Nov-2016 19:22:35 GMT; secure; HttpOnly 
Status: 400 Bad Request 
Vary: Accept-Encoding 
Via: 1.1 varnish 
X-Frame-Options: SAMEORIGIN 
X-MH-Cache: rails-varnish-api-aws-0538d8f099256d673; M 
X-Request-Id: 6f6355698a19e94058d35af2df918adb 
X-UA-Compatible: IE=Edge,chrome=1 
X-Varnish: 3967202340 
Content-Length: 75 
Connection: keep-alive 

然而,它會在那之後掛起而不再給我。正因爲如此,我無法調試爲什麼我收到不好的請求。有沒有人有任何想法,爲什麼這是? (這是我第一次發佈,抱歉,如果任何格式不正確)。

謝謝。

回答

0

可能是響應主體(json)不使用行終止符readLine將永遠等待行結束符,或者直到套接字關閉,由於您指定了HTTP/1.1並且沒有覆蓋默認保持活動狀態,所以這不會立即發生,儘管服務器可能會或可能不會選擇關閉如果你一直在等待,那麼一些隨意的時間。

當接收到HTTP響應時,你應該閱讀作爲行,直到終止標頭中的空行,但對於主體必須只讀的字節(未字符的數量,其可以是不同的在utf-8中,並且絕對不是行),或者如果啓用和使用傳輸編碼分塊,則由一系列塊標頭指定。閱讀rfc 2616,或者如果您有額外時間花費更新,更大的7230和7231.

或者更好的是,使用已經正確執行此操作的很多庫之一,例如Java中提供的(Https)URLConnection,或者流行的Apache HttpClient庫。

PS:您的問題幾乎可以肯定與SSL無關。

相關問題