Java OkHttp请求无法满足

时间:2017-10-14 01:18:20

标签: java authentication url httprequest okhttp

我正在使用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"}

如何解决?

1 个答案:

答案 0 :(得分:2)

你得到的回应是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客户端)的未经身份验证的调用。为了证明这一点,只需跟踪浏览器中的来电,您就会发现该请求包含一个名为“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,然后在请求标头中提供身份验证详细信息。