2017-10-14 6 views
0

URL에서 문자열을 다운로드하려면 okhttp를 사용하고 있습니다. 여기에 코드가 있습니다.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> 

내가 브라우저에 URL을 넣을 경우, 그것은 잘 작동합니다. 응답은 다음과 같습니다.

{"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 키 및 암호

Korbit API를 사용하려면 API 키와 암호를 요청해야합니다. 모든 Korbit 사용자는 Korbit 웹 사이트를 통해 API 키를 얻을 수 있습니다. 액세스 토큰 (및 새로 고침 토큰)을 얻으려면 POST 요청 본문에 사용자 이름과 암호가 필요한 직접 인증 API 호출을 통해 Korbit 계정에 로그인 할 수 있습니다. 이 문서에서 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을 따르고 yourelf를 등록한 다음 요청 헤더에 인증 세부 정보를 제공해야합니다.

+0

감사합니다. 사용자 에이전트가 필요하다고 생각하지 않습니다. – milosmns