2017-10-14 172 views
0

我使用okhttp從url下載字符串。這是代碼。Java OkHttp請求不能滿足

public static void main(String[] args) throws InterruptedException { 
    String jsonString = downloadJsonString("https://api.korbit.co.kr/v1/ticker/detailed?currency_pair=btc_krw"); 
    System.out.println(jsonString); 
} 

String downloadJsonString (String url) throws IOException { 
    OkHttpClient okHttpClient = new OkHttpClient(); 
    Request request = new Request.Builder() 
      .url(url) 
      .build(); 
    Response response = okHttpClient.newCall(request).execute(); 
    return response.body().string(); 
} 

的結果是這樣的:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> 
<TITLE>ERROR: The request could not be satisfied</TITLE> 
</HEAD><BODY> 
<H1>ERROR</H1> 
<H2>The request could not be satisfied.</H2> 
<HR noshade size="1px"> 
Request blocked. 
<BR clear="all"> 
<HR noshade size="1px"> 
<PRE>Generated by cloudfront (CloudFront) 
Request ID: jIs6PvNF01BMsQrynj4pk8eBXuQW-n-Q02Tav0SQghSZ7TzZOFfrAg== 
</PRE> 
<ADDRESS> 
</ADDRESS> 
</BODY></HTML> 

如果我把網址到瀏覽器,它工作正常。這裏是迴應:

{"timestamp":1507942765556,"last":"6355000","bid":"6355000","ask":"6358500","low":"6310000","high":"6949000","volume":"12329.815314799943534093","change":"0","changePercent":"0"} 

如何解決?

回答

2

您得到的回覆是Korbit的403 Forbidden響應。您收到此響應是因爲Korbit API要求您提供一些身份驗證詳細信息。從the docs

在使用Korbit API之前,您需要驗證用戶。由於Korbit API提供了OAuth 2.0界面,因此您在驗證成功後會獲得訪問令牌。對於每個API請求,您需要使用訪問令牌來設置授權HTTP標頭。 API密鑰和祕密

您需要請求一個API密鑰和密鑰才能使用Korbit API。所有Korbit用戶都可以通過Korbit網站獲取API密鑰。您可以通過直接身份驗證API調用登錄到您的Korbit帳戶,這需要POST請求正文中的用戶名和密碼才能獲取訪問令牌(以及刷新令牌)。在本文檔中,表示API密鑰,並表示相應的API密鑰。

因此,您向Korbit註冊時,他們會提供一些認證詳細信息,然後在HTTP請求中包含這些詳細信息。

您聲明相同呼叫通過您的瀏覽器完成,這必須是因爲Korbit允許源自瀏覽器(而不是程序化HTTP客戶端)的未經認證的呼叫。爲了證明這一點,只需跟蹤來自瀏覽器的調用,就會發現該請求包含一個名爲「User-Agent」的標頭,其中包含one of these values

可以在代碼中模擬這種如下:

Request request = new Request.Builder() 
     .url(url) 
     .header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:51.0)") 
     .build(); 

這將使您的通話成功完成,但不建議,我懷疑嘗試有限數量後Korbit會禁止它。相反,您需要遵循Korbit's instructions並註冊yourelf,然後在請求標頭中提供您的身份驗證詳細信息。

+0

謝謝。我不相信他們需要一個用戶代理。 – milosmns