我无法使用api

时间:2017-03-29 08:27:17

标签: perl api

我对API很新,所以我不知道这是否应该更直接。

我写了以下perl脚本

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);

然后当我得到我的回复并在调试器中打印时,我得到以下

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

值得注意的一条线是

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

我不知道如何获得正确的回复文字。我试着在他们的网站上搜索一些例子,但我似乎无法得到它。我也不确定关键是否只适用于scopus而不是我正在尝试使用的工程村。

这里有网站。 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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

要从您的回复中获取文字,您需要拨打$response->decoded_content method。这将为您提供可在调试输出中的_content中看到的JSON字符串。我缩进它以便于阅读。

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

您可以使用the JSON module将其解码为Perl数据结构。

use JSON 'from_json';

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

您收到的错误消息明确指出您未经过正确身份验证。我看过你提到的at this guide from the documentation。如果您拥有正确类型的帐户,apiKey网址参数似乎有效。您应该检查为您创建该帐户的人,或者如果您是,并且您不确定,该服务的客户经理是否与您合作。他们会告诉您是否使用了正确的API密钥,以及此身份验证方法是否适合您。

由于此API还提供了使用自定义标头X-ELS-APIKey: [apikey]进行身份验证,我建议使用它。您的API密钥是秘密,您不应与任何人共享。它就像一个密码。如果将其放入URL,它可能会显示在日志文件中。但作为标题,它通常不会。

这是向HTTP请求添加自定义标头的方法。如果您这样做,请确保您不再拥有apiKey网址参数。

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

现在作为最后一步,您应该检查响应的HTTP响应代码。 200(或以2开头的大多数其他代码)表示请求成功。您获得的403意味着未经授权,这也暗示您未经过正确的身份验证。

由于此API似乎在成功和失败情况下都返回JSON,因此您可能需要为两者解码它。如果你想检查故障响应,这是有道理的。如果没有,您可以跳过该部分。为此,请使用$res->is_success中使用的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 }

***image.lua***

local len = ffi.new("size_t[?]", 5)
local t = handle_result(self, lib.MagickGetImageHistogram(self.wand, len))

***lib.lua***

local ffi = require("ffi")
local lib
ffi.cdef([[  typedef void MagickWand;
typedef void PixelWand;

typedef int MagickBooleanType;
typedef int ExceptionType;
typedef int ssize_t;
typedef int CompositeOperator;
typedef int GravityType;
typedef int OrientationType;
typedef int InterlaceType;
typedef char DistortMethod[];

void MagickWandGenesis();
MagickWand* NewMagickWand();

PixelWand **MagickGetImageHistogram(MagickWand *wand, size_t *number_colors);