我正在使用okhttp从URL下载字符串。这是代码。

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


怎么解决?

最佳答案

您得到的响应是Korbit的403 Forbidden响应。之所以收到此响应,是因为Korbit API要求您提供一些身份验证详细信息。从the docs


  在使用Korbit API之前,您需要验证用户身份。由于Korbit API提供了OAuth 2.0接口,因此在成功身份验证后,您将获得访问令牌。对于每个API请求,您都需要使用访问令牌设置Authorization HTTP标头。
  API密钥和秘密
  
  您需要请求一个API密钥和密码才能使用Korbit API。所有Korbit用户都可以通过Korbit网站获取API密钥。您可以通过直接身份验证API调用登录到您的Korbit帐户,这需要在POST请求的正文中输入用户名和密码来获取访问令牌(和刷新令牌)。在本文档中,表示API密钥,并表示相应的API密钥。


因此,您向Korbit注册,他们为您提供一些身份验证详细信息,然后将这些详细信息包含在HTTP请求中。

您说过通过浏览器完成了相同的调用,这一定是因为Korbit允许来自浏览器(而不是编程HTTP客户端)的未经身份验证的调用。为了证明这一点,只需在浏览器中跟踪调用,您就会发现该请求包含带有one of these values的名为“ User-Agent”的标头。

您可以按照以下方式在代码中模拟这一点:

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并注册您的elf,然后在请求标头中提供身份验证详细信息。

09-26 12:26