我对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而不是我正在尝试使用的工程村。
任何帮助将不胜感激
答案 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);