2017-07-25 5 views
1

Ich brauche eine API für den Zugriff auf der wie folgt funktioniert:Benutzername Passing auf eine HttpGet Anfrage

curl https://api.com/ratings/v1/ -u [your token here]: 

Das Token ist der Benutzername, die die HttpGet Anforderung übergeben werden soll. Ich versuche, das gleiche in der folgenden Art und Weise mit Java zu tun:

CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("usrname", "passwrd")); 
HttpHost proxy = new HttpHost("proxy.com", 8080, "http"); 
HttpClient httpClient = HttpClients.custom().setProxy(proxy).setDefaultCredentialsProvider(credentialsProvider).build(); 

HttpGet toesGet = new HttpGet("https://api.com/ratings/v1/"); 

    toesGet.setHeader("Accept", "Application/Json"); 
    toesGet.addHeader("Username", "[your token here]"); 

    try { 
     HttpResponse toes = httpClient.execute(toesGet); 
     System.out.println(toes.getStatusLine()); 
     System.out.println(toes.getEntity().toString()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

ich hinter Proxy bin, so ist mir ein HttpHost mit den Proxy-Details erstellen, den Proxy für das HttpClient Objekt Einstellung und Weitergabe der Anmeldeinformationen für Proxy-Authentifizierung credentialsProvider in den folgenden Zeilen von Code verwendet:

HttpHost proxy = new HttpHost("proxy.com", 8080, "http"); 
HttpClient httpClient = HttpClients.custom().setProxy(proxy).setDefaultCredentialsProvider(credentialsProvider).build(); 

ich Passieren der username zum HttpGet durch die header wie folgt ergänzt:

toesGet.addHeader("Username", "[your token here]"); 

, wenn ich den Code ausführen, bekomme ich diese Antwort: (? Oder bedeutet das etwas anderes) HTTP/1.1 401 UNAUTHORIZED

Dies zeigt, dass ich nicht die username auf die HttpGet Anfrage in der richtigen Art und Weise bin vorbei. Also, was ist der richtige Weg den Benutzernamen an die Anfrage zu übergeben?

Jede Hilfe wäre willkommen, Danke!

Hinweis: Die usrname und passwrd ich in dem credentialsProvider gesetzt ist für die Proxy-Authentifizierung. Sie haben nichts mit der HttpGet-Anfrage selbst zu tun. Der Token, den ich übergeben muss, unterscheidet sich von dem in den Anmeldeinformationen angegebenen Code usrname.

+0

Aufruf 'setDefaultCredentialsProvider' sollte ausreichen, vorausgesetzt, Ihre Benutzername und Passwort sind korrekt. Soweit ich weiß, ist 'Benutzername' keine gültige Kopfzeile, also macht es wahrscheinlich nichts. – VGR

+0

Danke für den Kommentar. Die 'username' und' password', die ich im 'credentialsProvider' gesetzt habe, sind für die Proxy-Authentifizierung. Sie haben nichts mit der HttpGet-Anfrage selbst zu tun. @VGR –

Antwort

1

ich habe Apache Httpcomponents nicht benutzt, aber mein Verständnis ist, dass Sie die Anmeldeinformationen für bestimmte Hosts zu setzen haben:

CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
HttpHost proxy = new HttpHost("proxy.com", 8080, "http"); 
credentialsProvider.setCredentials(new AuthScope(proxy), 
    new UsernamePasswordCredentials("usrname", "passwrd")); 
credentialsProvider.setCredentials(new AuthScope("api.com", AuthScope.ANY_PORT), 
    new UsernamePasswordCredentials("apiuser", "apipassword")); 

Hinweis: Geben Sie in Ihrem Code nicht "apiuser" oder "apipassword" ein. Ich zeige diese nur als Platzhalter. Ersetzen Sie diese mit dem korrekten Benutzer und Passwort für den Zugriff auf api.com. (Ich weise darauf hin, weil ich, basierend auf dem Code in Ihrer Frage, nicht sicher bin, ob Sie verstanden haben, dass Sie die Literalzeichenfolge "[your token here]" nicht verwenden sollten.)

+0

Danke für die Antwort. Ich habe versucht zu tun, was du vorgeschlagen hast. Aber ich bekomme immer noch die gleiche "unautorisierte" Antwort. –

+0

Anfangs gab ich das 'Authscope' falsch an. hat es jetzt korrigiert und es funktioniert! Danke vielmals! :) –

1

Ich denke, Ihr Server verwendet Standardauthentifizierung, dann müssen Sie die „Berechtigung“ Header statt „Benutzername“ hinzuzufügen:

String user = "[your token here]"; 
String pwd = ""; // blank 
toesGet.addHeader("Authorization", "Basic " + Base64.encodeToString((user + ":" + pwd).getBytes(), Base64.NO_WRAP)); 

oder wenn Ihr Token Benutzer und PWD enthält, dann versuchen Sie es so, :

String token = "[your token here]"; 
toesGet.addHeader("Authorization", "Basic " + Base64.encodeToString(token.getBytes(), Base64.NO_WRAP)); 
+0

Danke für die Antwort. Ich habe versucht, die oben genannten Zeilen in meinem Code zu verwenden, und ich bekomme den folgenden Fehler: 'Java: kann Symbolsymbol nicht finden: Variable NO_WRAP-Speicherort: Klasse jodd.util.Base64'.Ich habe versucht, die' Base64.NO_WRAP' aber dann zu entfernen Ich bekomme 'java.lang.ClassNotFoundException: jodd.util.Base64'.Ich bin mir ziemlich sicher, dass ich die maven-Abhängigkeit für diese Klasse hinzugefügt habe. Ich habe auch versucht, die Base64 vollständig zu entfernen. Wie folgt: 'toesGet.addHeader (" Authorization "," Basic "+" token: "+" ");' und ich bekomme immer noch die 'nicht autorisierte' Antwort. Ich habe keine Variable für das Token erstellt, sondern direkt als String eingegeben. –