cURL在PHP中调用API不起作用

cURL在PHP中调用API不起作用,php,curl,Php,Curl,我尝试过使用标准URL调用API。所有这些都可以直接从浏览器中完美地工作。例如: 组织%22&startRecord=101&maximumRecords=100&wskey=7RN7E7OSOEQUARIEO4GH74HZA6BLDT7ExahgXDVWNFO6PH7ZA1OZ9NUDHVO34B5HFNLUOW 工程%22和startRecord=101和maximumRecords=100和wskey=7RN7E7OSOEQUARIEO4GH74HZA6BLDT7EXAHGxDVNFO6P

我尝试过使用标准URL调用API。所有这些都可以直接从浏览器中完美地工作。例如:

组织%22&startRecord=101&maximumRecords=100&wskey=7RN7E7OSOEQUARIEO4GH74HZA6BLDT7ExahgXDVWNFO6PH7ZA1OZ9NUDHVO34B5HFNLUOW

工程%22和startRecord=101和maximumRecords=100和wskey=7RN7E7OSOEQUARIEO4GH74HZA6BLDT7EXAHGxDVNFO6PH7ZA1OZ9NUDHVO34B5HFNLUOW

但是,当我使用cURL来执行此操作时,我一直会遇到API中的错误,即wskey未连接:

function curl_get_contents($url)
{
    $ch = curl_init();
d($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

d($OCLCqueries);
foreach ($OCLCqueries as $OCLCquery) {
    // echo "managed1";
    $XMLdata = curl_get_contents($OCLCquery);
    // echo "managed2";
}
我在前面定义了$oclcquerys。它是一个数组,包含URL调用作为值。 d()是我从安装的库中调用的一个函数,它是var_dump()的一种更复杂的形式,基本上具有相同的用途(用作调试的断点),但以更易于理解的格式转储数据

这是我的输出:

<body><h1>HTTP Status 400 - org.oclc.wskey.api.WSKeyException: WsKeyParam(wskey) not found in request</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>org.oclc.wskey.api.WSKeyException: WsKeyParam(wskey) not found in request</u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect (org.oclc.wskey.api.WSKeyException: WsKeyParam(wskey) not found in request).</u></p><HR size="1" noshade="noshade"><h3></h3></body>
HTTP Status 400-org.oclc.wskey.api.WSKeyException:WsKeyParam(wskey)未在请求中找到
类型状态报告

消息org.oclc.wskey.api.WSKeyException:WsKeyParam(wskey)未在请求中找到描述客户端发送的请求在语法上不正确(org.oclc.wskey.api.WSKeyException:WsKeyParam(wskey)未在请求中找到)。



如何解决这个问题?

最初我认为失败的最可能原因是请求中缺少
用户代理
字符串,但在测试下面的代码时发现,它的存在与否没有任何区别,因此我相信问题在于cURL请求中使用的url格式,因为它已经编码将baseurl和下面的参数分开,效果很好

$url='http://www.worldcat.org/webservices/catalog/search/sru';
$params=array(
    'query'             =>  'srw.su="Computer organization"',
    'startRecord'       =>  101,
    'maximumRecords'    =>  100,
    'wskey'             =>  '7Rn7E7osoeJeQURAiEO4GH74HZa6BLdt7eXahgxdvwnfO6Ph7za1OzU9M2zx0e9nuDHVO34b5HfnLuOw'
);


function curl_get_contents( $url=false, $params=array() ){
    if( $url && !empty( $params ) ){

        $url = $url . '?' . http_build_query( $params );

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0 );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt($ch, CURLOPT_URL, $url );
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0' );

        $data = curl_exec($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);

        return (object)array(
            'response'  =>  $data,
            'info'      =>  $info
        );
    }
}

$data = curl_get_contents( $url, $params );
print_r( $data->response );
为了简化对main函数的调用,可以创建一个简单的包装函数,如下所示

function getcatalog( $baseurl=false, $term=false, $start=1, $max=1, $key=false ){
    if( $baseurl && $term && $key ){
        $params=array(
            'query'             =>  'srw.su="'.$term.'"',
            'startRecord'       =>  $start,
            'maximumRecords'    =>  $max,
            'wskey'             =>  $key
        );
        return curl_get_contents( $baseurl, $params );
    }
}

$data = getcatalog( $url, 'Computer organization', 1, 100,'7Rn7E7osoeJeQURAiEO4GH74HZa6BLdt7eXahgxdvwnfO6Ph7za1OzU9M2zx0e9nuDHVO34b5HfnLuOw');
if( $data->info['http_code']==200 ){
    print_r( $data->response );
}

实际上,OP帖子中的问题是,URL中的
计算机组织
中有一个空格。将空格替换为%20,因此它改为
Computer%20organization
,效果很好:
http://www.worldcat.org/webservices/catalog/search/sru?query=srw.su%3D%22Computer%20organization%22&startRecord=101&maximumRecords=100&wskey=7RN7E7OSOEQUARIEO4GH74HZA6BLDT7EXAHGXDVNFO6PH7ZA1OZU9M2ZX0E9NUDHVO34B5HFNLUOW
-谷歌浏览器在粘贴时会自动识别错误,并将其修复-但Curl不会。实际上,问题是URL中的
计算机组织中有一个空格。将空格替换为%20,它表示
计算机er%20organization
相反,它工作正常:
http://www.worldcat.org/webservices/catalog/search/sru?query=srw.su%3D%22Computer%20organization%22&startRecord=101&maximumRecords=100&wskey=7Rn7E7osoeJeQURAiEO4GH74HZa6BLdt7eXahgxdvwnfO6Ph7za1OzU9M2zx0e9nuDHVO34b5HfnLuOw
-谷歌Chrome在粘贴时识别该错误,并自动修复,但Curl不会。