【问题标题】:Java OkHttp request cannot be satisfied无法满足 Java OkHttp 请求
【发布时间】:2017-10-18 05:27:07
【问题描述】:

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

如果我将 url 放入浏览器,它就可以正常工作。回复如下:

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

如何解决?

【问题讨论】:

    标签: java authentication url httprequest okhttp


    【解决方案1】:

    您收到的回复是 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 请求中。

    您说 same 调用通过您的浏览器完成,这一定是因为 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 并注册自己,然后在请求标头中提供您的身份验证详细信息。

    【讨论】:

    • 谢谢。我不敢相信他们需要用户代理。
    猜你喜欢
    • 2018-03-03
    • 2022-08-12
    • 1970-01-01
    • 2021-05-12
    • 2021-11-23
    • 2023-03-30
    • 1970-01-01
    • 2020-12-28
    • 2014-08-20
    相关资源
    最近更新 更多