[英]cURL to call API in PHP not working
我嘗試使用標准URL調用API。 所有功能都可以直接在瀏覽器中完美運行。 例如:
http://www.worldcat.org/webservices/catalog/search/sru?query=srw.su%3D%22Computer Organization%22&startRecord = 101&maximumRecords = 100&wskey = 7Rn7E7osoeJeQURAiEO4GH74HZa6BLdt7eXahgxdvwnfO6Ph7za1O7n1w9n
http://www.worldcat.org/webservices/catalog/search/sru?query=srw.su%3D%22Computer engineering%22&startRecord = 101&maximumRecords = 100&wskey = 7Rn7E7osoeJeQURAiEO4GH74HZa6BLdt7eXahgxdvwnfO6Ph7za1O7n1w9n
但是,當我使用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";
}
我之前定義了$ OCLCqueries。 它是一個包含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>
我該如何解決這個問題?
最初,我認為失敗的最可能原因是請求中缺少User-Agent
字符串,但是發現,在測試以下代碼時,它的存在與否沒有任何區別,因此我認為問題在於所用網址的格式在cURL請求中,因為它已被編碼。 通過如下分隔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 );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.