2
$adapter = new \Zend\Http\Client\Adapter\Curl();

    $client = new \Zend\Http\Client($url);
    $client->setAdapter($adapter);
    $client->setMethod('POST');
    $adapter->setOptions(array(
        'curloptions' => array(
                            CURLOPT_POST => 1,
            CURLOPT_POSTFIELDS => $data,
            CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
            CURLOPT_USERPWD => "username:password",
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => FALSE,
            CURLOPT_SSL_VERIFYHOST => FALSE,

        )
    ));
  $client->send();

以上截断了我正在使用的内容,我正在关注此处的文档http://framework.zend.com/manual/2.0/en/modules/zend.http.client.adapters.html

问题是,当我执行自己的 curl 函数调用时,它工作正常,并且我得到了有效的响应。但是当我使用 zend 约定时,我不断收到 401-未授权。我使用的 curl 选项对于两种方法都是相同的。

有什么建议吗?

4

3 回答 3

3

由于 CURLOPT_POSTFIELDS 和 CURLOPT_POST 被 Curl.php 中的 invalidOverwritableCurlOptions 数组阻止,因此您要做的是在客户端上设置参数。

在 Zend/Http/Client 中使用 setParameterPost 方法,如下所示:

    use Zend\Http\Client;
    use Zend\Http\Client\Adapter\Curl;

    //some post params
    $postParams = array('per_page' => 25);

    $adapter = new Curl();
    // -- add your curl options here (excluding CURLOPT_POST and CURLOP_POSTFIELDS --

    $client = new Client('https://example.com/somePage');
    $client->setAdapter($adapter);
    $client->setMethod('POST');
    $client->setParameterPost($postParams);
    $response = $client->send($client->getRequest());

    //output the response
    echo $response->getBody()."<br/>";

您甚至不需要创建一个 Request 对象,因为 Client 类无论如何都会创建一个。在上面的代码中,我只是检索了 Client 使用 getRequest 方法创建的那个,然后将它传递给 send 方法。

于 2013-11-26T02:09:10.523 回答
2

我记得那个例子有问题,所以我用了另一个,这对我有用:

$request = new Request();
$request->setUri($url);
$request->setMethod('POST');

$client = new Client();
$adapter = new \Zend\Http\Client\Adapter\Curl();
$client->setAdapter($adapter);

$adapter->setOptions(array(
    'curloptions' => array(
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD => "username:password",
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLOPT_SSL_VERIFYHOST => FALSE,
    )
));

$response = $client->dispatch($request);
于 2012-12-14T03:44:03.233 回答
0

Zend 不允许覆盖选项 CURLOPT_POSTFIELDS。

你需要弄清楚如何覆盖它。

从 Zend 库的 curl.php 中的 invalidOverwritableCurlOptions 中删除此选项将解决您的问题。但是你需要找到不干扰图书馆的方式。

于 2013-03-15T10:40:16.013 回答