2017-10-06 3 views
1

Ich habe ein Problem mit der HttpClient-Bibliothek in Java.403 Antwort mit HttpClient aber nicht mit Browser

Die Zielwebsite ist auf SSL (https://www.betcris.com), und ich kann die Indexseite von dieser Website problemlos laden.

Die verschiedenen Seiten, die Quoten für die verschiedenen Sportarten zeigen, geben jedoch einen Antwortcode 403 mit HttpClient zurück, aber das Laden der gleichen Seiten in einem Browser funktioniert einwandfrei.

Hier ist eine solche Seite: https://www.betcris.com/en/live-lines/soccer.

Ich begann mit der Fehlersuche auf dieser Seite mit den Informationen von HttpFox (ein Firefox-Add-on, das LiveHttpHeaders ähnelt), um sicherzustellen, dass ich alle richtigen Header und Cookies hatte, aber ich konnte nicht mit HttpClient laden. Ich habe auch festgestellt, dass Cookies nichts mit dem Problem zu tun haben, da ich alle Cookies für diese Website in meinem Browser entfernen kann und dann direkt auf die Seite klicke und sie lädt.

Ich habe bestätigt, dass etwas Besonderes mit diesen Seiten passiert, indem Sie das Online-Tool unter http://www.therightapi.com/test verwenden. Mit diesem Tool können Sie die URL einer Seite zusammen mit einem beliebigen Anforderungsheader eingeben und die Antwort anzeigen, die Sie von der Zielwebsite erhalten. Mit diesem Tool kann ich https://www.google.com laden, aber ich bekomme den gleichen 403 Fehler beim Versuch, https://www.betcris.com/en/live-lines/soccer zu laden.

Hier ist mein Setup bei therightapi:

enter image description here

Und die Antwort:

enter image description here

Weiß jemand, was hier vor sich geht?

Danke.

EDIT: Ich habe ein Testprojekt erstellt, hier ist der Java-Code, die Maven-Abhängigkeit gefolgt Sie in Ihrem pom haben sollten:

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> 

Antwort

0

403 Forbidden verwendet wird, eine Authentifizierungsanforderung zu signalisieren. In der Tat sollte die vollständige Antwort Ihnen genau das sagen. Zum Glück, HttpClient can do authentication.

+0

Ich verstehe, dass. Was ich nicht verstehe ist, wie mein Browser, mit allen Cookies und Cache gelöscht, Zugriff auf diese Webseite OHNE Authentifizierung haben kann? – user1646686

+0

@ user1646686: Die Authentifizierung hängt nicht von Cookies oder Caches ab. – MSalters

+0

können Sie dies bitte genauer ausführen, da ich nach meinem Verständnis von HTTP - Authentifizierung einen Benutzernamen und ein Passwort für einen Server angeben werde, der Server eine Sitzung erstellt, sobald Benutzername und Passwort verifiziert wurden, und dann einen Cookie an den Server zurücksendet Aufrufer, und dieser Cookie wird von diesem Zeitpunkt an in zukünftigen Aufrufen an diesen Server zurückgegeben, wodurch der Server die Informationen im Cookie mit der Sitzung abgleichen kann. Ich kann nicht erkennen, welche Authentifizierung stattfindet, wenn ich auf die betreffende URL zugreife, ohne Anmeldeinformationen anzugeben? – user1646686

0

Ich verwende den folgenden Code zu HTTPS Urls verbrauchen:

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> 
Verwandte Themen