2017-10-14 3 views
0

Ich verwende okhttp, um eine Zeichenfolge von einer URL herunterzuladen. Hier ist der Code.Java OkHttp Anfrage kann nicht erfüllt werden

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(); 
} 

Das Ergebnis ist wie folgt aus:

<!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> 

Wenn ich die URL in Browser setzen, es funktioniert gut. Hier ist die Antwort:

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

Wie zu lösen?

Antwort

2

Die Antwort, die Sie bekommen, ist Korbits 403 Forbidden Antwort. Sie erhalten diese Antwort, weil die Corbit API einige Authentifizierungsdetails angeben muss. Von the docs:

Vor der Verwendung der Korbit-API müssen Sie einen Benutzer authentifizieren. Da die Corbit-API die OAuth 2.0-Schnittstelle bereitstellt, erhalten Sie nach einer erfolgreichen Authentifizierung ein Zugriffstoken. Für jede API-Anforderung müssen Sie den Autorisierungs-HTTP-Header mit dem Zugriffstoken festlegen. API Keys und Secrets

Sie müssen einen API-Schlüssel und ein Geheimnis anfordern, um die Korbit-API zu verwenden. Alle Korbit-Benutzer können den API-Schlüssel über die Korbit-Website abrufen. Sie können sich über einen API-Aufruf für die direkte Authentifizierung in Ihrem Korbit-Konto anmelden. Hierfür sind Benutzername und Kennwort im Hauptteil der POST-Anforderung erforderlich, um ein Zugriffstoken (und ein Aktualisierungstoken) abzurufen. In diesem Dokument bezeichnet einen API-Schlüssel und bezeichnet ein entsprechendes API-Geheimnis.

Also, Sie registrieren sich bei Korbit, sie bieten Ihnen einige Authentifizierungsdetails und dann fügen Sie diese Details in Ihre HTTP-Anfragen ein.

Sie erklärte, dass die gleichen Anruf über Ihren Browser abgeschlossen ist, werden diese muss, weil Korbit nicht authentifizierte Anrufe ermöglichen, die von einem Browser stammen (anstatt einer programmatischen HTTP-Client). Um dies nachzuweisen, verfolgen Sie einfach den Anruf von Ihrem Browser und Sie werden feststellen, dass die Anfrage eine Kopfzeile mit dem Namen "User-Agent" mit one of these values enthält.

Sie könnte dies in Ihrem Code imitieren, wie folgt:

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

Dies würde es ermöglichen Ihren Anruf erfolgreich abgeschlossen, aber es wird nicht empfohlen, und ich vermute, Korbit es nach einer begrenzten Anzahl von Versuchen nicht zulassen würde. Stattdessen müssen Sie Korbit's instructions folgen und yourrel registrieren und dann Ihre Authentifizierungsdetails in Ihren Anforderungsheadern angeben.

+0

DANKE. Ich kann nicht glauben, dass sie einen User Agent benötigen. – milosmns

Verwandte Themen