2017-03-29 3 views
0

Ich bin ziemlich neu zu APIs, so dass ich nicht weiß, ob dies einfacher sein sollte.Ich kann nicht mit einer API verbinden

Ich schreibe das folgende Perl-Skript

use strict; 
use LWP::UserAgent; 
require HTTP::Request; 

my $request = HTTP::Request->new(GET => 'http://api.elsevier.com/content/ev/results?apiKey=1234&query=stress&database=c&updateNumber=1&pageSize=1'); 

my $ua = LWP::UserAgent->new; 
my $response = $ua->request($request); 

dann, wenn ich meine Antwort bekommen und es im Debugger drucke ich die folgende

HTTP::Response=HASH(0x9aedff8) 
    '_content' => '{"service-error":{"status":{"statusCode":"AUTHENTICATION_ERROR","statusText":"Requestor configuration settings insufficient for access to this resource."}}}' 
    '_headers' => HTTP::Headers=HASH(0x9aedfe8) 
     'allow' => 'GET' 
     'client-date' => 'Wed, 29 Mar 2017 08:08:25 GMT' 
     'client-peer' => '198.185.19.118:80' 
     'client-response-num' => 1 
     'content-length' => 156 
     'content-type' => 'application/json;charset=UTF-8' 
     'date' => 'Wed, 29 Mar 2017 08:08:24 GMT' 
     'p3p' => 'CP="IDC DSP LAW ADM DEV TAI PSA PSD IVA IVD CON HIS TEL OUR DEL SAM OTR IND OTC"' 
     'server' => 'api.elsevier.com 9999' 
     'vary' => 'Origin' 
     'x-cnection' => 'close' 
     'x-els-apikey' => 'e688c9db4db0386581dbe4c4dda46164' 
     'x-els-reqid' => '0000015b190d89fe-a0d0' 
     'x-els-status' => 'AUTHENTICATION_ERROR(Requestor configuration settings insufficient for access to this resource.)' 
     'x-els-transid' => 'cbf787b4-d171-4e35-8237-8cab3c931205' 
     'x-re-ref' => '1 1490774904423414' 
    '_msg' => 'Forbidden' 
    '_protocol' => 'HTTP/1.1' 
    '_rc' => 403 
    '_request' => HTTP::Request=HASH(0x9fc3000) 
     '_content' => '' 
     '_headers' => HTTP::Headers=HASH(0x9ae73e0) 
     'user-agent' => 'libwww-perl/5.831' 
     '_method' => 'GET' 
     '_uri' => URI::http=SCALAR(0x9e25188) 
     -> 'http://api.elsevier.com/content/ev/results?apiKey=e688c9db4db0386581dbe4c4dda46164&query=stress&database=c&updateNumber=1&pageSize=1' 
     '_uri_canonical' => URI::http=SCALAR(0x9e25188) 
     -> REUSED_ADDRESS 

einer der bemerkenswerten Linien erhalten wird

x-els-status' => 'AUTHENTICATION_ERROR(Requestor configuration settings  insufficient for access to this resource.)' 

Ich weiß nicht, wie man einen richtigen Antworttext bekommt. Ich habe versucht, auf ihren Websites nach Beispielen zu suchen, aber ich kann es nicht verstehen. Ich bin mir auch nicht sicher, ob der Schlüssel nur für Scopus ist, aber nicht für das Dorf, das ich benutzen möchte.

Dort ist die Website hier. https://dev.elsevier.com/index.html?utm_expid=89327795-0.AtRZzToKQ2u1mZEyQ3n7OQ.0&utm_referrer=https%3A%2F%2Fdev.elsevier.com%2Ftecdoc_ev_retrieval_request.html

jede Hilfe

+0

API-Schlüssel sind für jeden Dienst spezifisch, sagst du, dass du versuchst, dies wiederzuverwenden? Auch sind sie normalerweise Rate begrenzt, also, wenn Sie den Service wieder und wieder geschlagen haben, erhalten Sie eine Meldung wie diese. Erwägen Sie, die Serverseite zu untersuchen, auf der Sie den API-Schlüssel eingerichtet haben. Ich glaube nicht, dass dies ein Perl-Problem ist. –

+0

Ich habe eine Antwort mit einer kleinen Anleitung geschrieben, wie man mit so etwas anfangen kann. Aber wenn Sie sich nicht sicher sind, was Sie mit Ihrem API-Schlüssel tun können, sollten Sie wirklich mit Ihrem Account Manager oder demjenigen, der Ihnen diesen Schlüssel gegeben hat, sprechen. – simbabque

Antwort

2

geschätzt würde den Text aus Ihrer Antwort zu erhalten, müssen Sie die $response->decoded_content method nennen. Das gibt Ihnen die JSON-Zeichenfolge, die Sie in Ihrer Debug-Ausgabe in _content sehen können. Ich habe es eingerückt, damit es leichter zu lesen ist.

{ 
    "service-error" : { 
     "status" : { 
     "statusCode" : "AUTHENTICATION_ERROR", 
     "statusText" : "Requestor configuration settings insufficient for access to this resource." 
     } 
    } 
} 

können Sie the JSON module verwenden diese in eine Struktur Perl Daten zu entschlüsseln.

use JSON 'from_json'; 

my $res = $ua->request($req); 
my $json = from_json($res->decoded_content); 

Die Fehlermeldung Sie wieder klar zu bekommen besagt, dass Sie nicht richtig authentifiziert werden. Ich habe gesucht at this guide from the documentation Sie erwähnt. Es scheint, dass der URL apiKey funktioniert, wenn Sie den richtigen Kontotyp haben. Sie sollten mit demjenigen Kontakt aufnehmen, der dieses Konto für Sie eingerichtet hat, oder wenn Sie dies waren und Sie sich nicht sicher sind, der Account Manager bei diesem Dienst, der mit Ihnen zusammenarbeitet. Sie sagen Ihnen, ob Sie den richtigen API-Schlüssel verwenden und ob diese Authentifizierungsmethode für Sie funktioniert.

Da diese API auch die Verwendung eines benutzerdefinierten Headers X-ELS-APIKey: [apikey] für die Authentifizierung bietet, würde ich vorschlagen, dies zu verwenden. Ihr API-Schlüssel ist ein Geheimnis und Sie sollten es nicht mit anderen teilen. Es ist wie ein Passwort. Wenn Sie es in die URL eingeben, wird es möglicherweise in Protokolldateien angezeigt. Aber als Header tut es das normalerweise nicht.

So fügen Sie einen benutzerdefinierten Header zu einer HTTP-Anfrage hinzu. Stellen Sie sicher, dass Sie den URL-Parameter apiKey nicht mehr haben, wenn Sie dies tun.

my $req = HTTP::Request->new(GET => $url); # no apiKey=123 here! 
$req->header('X-ELS-APIKey' => 123); 

nun als letzter Schritt, sollten Sie die HTTP-Response-Code der Antwort überprüfen. A 200 (oder die meisten anderen Codes, die mit 2 beginnen) bedeutet, dass die Anforderung erfolgreich war. Die 403, die Sie zurück erhalten, bedeutet nicht autorisierte, die auch darauf hinweist, dass Sie nicht ordnungsgemäß authentifiziert sind.

Da es so aussieht, als würde diese API JSON sowohl in Erfolgs- als auch in Fehlerfällen zurückgeben, müssen Sie sie möglicherweise für beide dekodieren. Wenn Sie die Fehlerreaktion untersuchen möchten, ist das sinnvoll. Wenn nicht, können Sie diesen Teil überspringen. Verwenden Sie dazu $res->is_success, das auch in der synopsis of the LWP::UserAgent documentation verwendet wird.

use strict; 
use warnings; 
use LWP::UserAgent; 
use HTTP::Request; 
use JSON 'from_json'; 

my $ua = LWP::UserAgent->new; 
my $req = HTTP::Request->new(GET => 'http://api.elsevier.com/content/ev/results?query=stress&database=c&updateNumber=1&pageSize=1'); 
$req->header('X-ELS-APIKey' => 123); 

if ($req->is_success) { 
    my $json = from_json($res->decoded_content); 
    # ... do stuff with the response 
} else { 
    # something went wrong 
} 
Verwandte Themen