在PHP中使用curl而不是http请求2

时间:2014-04-03 07:11:45

标签: php curl

我正在尝试使用curl而不是PHP中的http request 2 pear模块来查询plivo api。他们有一个现有的库,可以轻松调用他们的API,但它使用一个名为http request2的梨模块。我真的不知道如何在服务器上安装pear模块,所以我想只是重写它们库的某些部分才能使用curl。 以下是我特别想要修改的代码部分:

function __construct($auth_id, $auth_token, $url="https://api.plivo.com", $version="v1") {
    if ((!isset($auth_id)) || (!$auth_id)) {
        throw new PlivoError("no auth_id");
    }
    if ((!isset($auth_token)) || (!$auth_token)) {
        throw new PlivoError("no auth_token");
    }
    $this->version = $version;
    $this->api = $url."/".$this->version."/Account/".$auth_id;
    $this->auth_id = $auth_id;
    $this->auth_token = $auth_token;
}

private function request($method, $path, $params=array()) {
    $url = $this->api.rtrim($path, '/').'/';
    if (!strcmp($method, "POST")) {
        $req = new HTTP_Request2($url, HTTP_Request2::METHOD_POST);
        $req->setHeader('Content-type: application/json');
        if ($params) {
            $req->setBody(json_encode($params));
        }
    } else if (!strcmp($method, "GET")) {
        $req = new HTTP_Request2($url, HTTP_Request2::METHOD_GET);
        $url = $req->getUrl();
        $url->setQueryVariables($params);
    } else if (!strcmp($method, "DELETE")) {
        $req = new HTTP_Request2($url, HTTP_Request2::METHOD_DELETE);
        $url = $req->getUrl();
        $url->setQueryVariables($params);
    }
    $req->setAdapter('curl');
    $req->setConfig(array(
        'timeout' => 30,
        'ssl_verify_peer' => FALSE,
    ));
    $req->setAuth($this->auth_id, $this->auth_token, HTTP_Request2::AUTH_BASIC);
    $req->setHeader(array(
        'Connection' => 'close',
        'User-Agent' => 'PHPPlivo',
    ));
    $r = $req->send();
    $status = $r->getStatus();
    $body = $r->getbody();
    $response = json_decode($body, true);
    return array("status" => $status, "response" => $response);
}

  public function get_account($params=array()) {
    return $this->request('GET', '', $params);
}

这是我到目前为止的代码:

<?php
$curl = curl_init();
$curl_options = array(
    CURLOPT_URL => 'https://api.plivo.com/v1/Account/',
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_USERPWD => 'auth_id:auth_token',
    CURLOPT_HTTPHEADER => array("Connection: close", "User-Agent: PHPPlivo"),
    CURLOPT_TIMEOUT => 30

);
curl_setopt_array($curl, $curl_options);
$response = curl_exec($curl);
curl_close($curl);
?>

我真的不知道幕后发生了什么,但是这个特定的代码告诉我它使用auth id和auth令牌的值进行基本身份验证:

$req->setAuth($this->auth_id, $this->auth_token, HTTP_Request2::AUTH_BASIC);

所以我也用curl设置它:

CURLOPT_USERPWD => 'auth_id:auth_token',

我几乎被困住了。我得到的所有内容如下:

{
  "error": "not found"
}

对于我错过或做错的事情并没有多大意义。请帮忙。提前谢谢!

2 个答案:

答案 0 :(得分:1)

以下是将新代码与旧代码同步时需要处理的事项:

如果您使用GET方法

CURLOPT_URL => 'https://api.plivo.com/v1/Account/'.http_build_query($params),
CURLOPT_HTTPHEADER => array("User-Agent: PHPPlivo"),

如果您使用POST方法

CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($params),
CURLOPT_HTTPHEADER => array("Content-type: application/json", "User-Agent: PHPPlivo"),

答案 1 :(得分:0)

是的......对于Plivo的包装来说,PEAR的依赖性肯定是过度的。所以这是我对代码进行的第一次修改。

退房: https://github.com/ashbeats/Plivo-Curl-Based-Wrapper/

唯一的区别是RestAPI::request()方法。