簡體   English   中英

cURL調用PHP中的API不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM