2017-10-06 18 views
1

javaのHttpClientライブラリに問題があります。HttpClientでは403の応答がありますが、ブラウザでは応答しません。

対象のWebサイトはSSL(https://www.betcris.com)であり、そのサイトからインデックスページをロードできます。

しかし、さまざまなスポーツのオッズを示すさまざまなページは、HttpClientで403応答コードを返しますが、ブラウザで同じページを読み込むとうまく動作します。

ここにそのようなページ:https://www.betcris.com/en/live-lines/soccerがあります。

このページのトラブルシューティングは、HttpFox(LiveHttpHeadersに似たFirefoxアドオン)によって収集され、すべてのリクエストヘッダーとCookieが正しいことを確認していますが、HttpClientを使用して読み込むことができませんでした。私はまた、ブラウザ内のそのWebサイトのすべてのクッキーを削除してからページを直接読み込んで読み込むことができるので、クッキーは問題とは関係がないと判断しました。

私は、http://www.therightapi.com/testのオンラインツールを使用して、これらのページで特別なことが起こっていることを確認しました。このツールを使用すると、任意のリクエストヘッダーとともにページのURLを入力し、ターゲットWebサイトから得た応答を表示することができます。このツールを使用してhttps://www.google.comをロードすることはできますが、https://www.betcris.com/en/live-lines/soccerをロードしようとすると同じ403エラーが発生します。

は、ここにtherightapiで私の設定です:

enter image description here

と応答:

enter image description here

誰もがここで何が起こっているか知っていますか?

ありがとうございました。

編集:私はここにあなたがあなたのポンポンを持っている必要がありますMavenの依存関係が続いJavaコードは、だ、テストプロジェクトを作成しました:認証要件を通知するために使用される

package com.yourpackage; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.HttpClientBuilder; 

public class TestHttpClient { 
    public static void main(String[] args) { 
     String url = "https://www.betcris.com/en/live-lines/soccer"; 

     HttpClient client = HttpClientBuilder.create().build(); 
     HttpGet request = new HttpGet(url); 

     // add request header 
     request.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"); 
     try { 
      HttpResponse response = client.execute(request); 
      System.out.println("Response Code : " 
        + response.getStatusLine().getStatusCode()); 

      BufferedReader rd = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent())); 

      StringBuffer result = new StringBuffer(); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       result.append(line); 
      } 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 



    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> 
<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.5.3</version> 
</dependency> 

答えて

0

403 Forbidden。実際には、完全な403の応答が正確にそれを伝えるべきです。幸いにも、HttpClient can do authentication

+0

私はそれを理解しています。私が理解していないことは、すべてのCookieとキャッシュがクリアされたブラウザが、どのような認証なしでそのWebページにアクセスできるかです。 – user1646686

+0

@ user1646686:認証はCookieやキャッシュに依存しません。 – MSalters

+0

あなたはそれを詳しく教えてください。HTTPを使った認証の理解は、ユーザーがサーバーにユーザー名とパスワードを提供し、ユーザー名とパスワードが確認されたらサーバーがセッションを作成してから、このクッキーは、その時点からそのサーバーへの呼び出しで返され、サーバーはクッキー内の情報をセッションに一致させることができます。資格情報を提供せずに問題のURLにアクセスすると、どのような認証が行われているのか分かりません。 – user1646686

0

私はHTTPSのURLを消費するために、次のコードを使用します。

import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.CloseableHttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.conn.ssl.NoopHostnameVerifier; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.ssl.SSLContextBuilder; 

... 

    SSLContext sslContext = 
      new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true).build(); 

    try (CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext) 
                .setSSLHostnameVerifier(new NoopHostnameVerifier()).build()) { 
     HttpGet httpGet = new HttpGet("YOUR_HTTPS_URL"); 
     httpGet.setHeader("Accept", "application/xml"); 
     httpGet.setHeader("User-Agent", 
          "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 

     HttpResponse response = httpClient.execute(httpGet); 

     logger.info("Response: " + response); 

    } 

のpom.xml:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.5.3</version> 
</dependency> 
関連する問題