php cURL有时会起作用,有时也不会

时间:2017-08-30 00:28:34

标签: php curl

我有一个奇怪的情况。

我正在尝试在php中发出curl请求。有时它会返回有效的响应,有时会返回"HTTP/1.1 401 Unauthorized。一种常见的模式是,如果我等待很长时间,请求之间有5分钟的工作时间。如果我在彼此之后立即提出请求则失败。 (这种模式也不一致)但有时我可以一个接一个地提出成功的请求。

如果我使用curl命令发出相同的请求,它会一直有效。两者之间的冗长完全相同。

<?php
$api = new ApiRestTest(URL,LOGIN,APIKEY);
$result = $api->curl_req(CONTACT_TEST);
var_dump($result);

class ApiRestTest
{
protected $_url;
protected $_username;
protected $_apiKey;

public function __construct($url, $username, $apiUserKey) {
    $this->_url = $url;
    $this->_username = $username;
    $this->_apiKey = $apiUserKey;
}

private function getHeader() {
    $nonce = base64_encode(substr(md5(uniqid()), 0, 16));;
    $created = date('c');
    $digest = base64_encode(sha1(base64_decode($nonce) . $created . $this->_apiKey, true));

    $wsseHeader[] = "Content-type:application/vnd.api+json";
    $wsseHeader[] = "Accept: application/json";
    $wsseHeader[] = "Authorization: WSSE profile=\"UsernameToken\"";
    $wsseHeader[]= sprintf(
        'X-WSSE: UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $this->_username, $digest, $nonce, $created
    );
    var_dump($wsseHeader);
    return $wsseHeader;
}

public function curl_req($path, $data=array())
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $this->_url . $path);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_USERAGENT, 'curl/7.54.0');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeader());
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}}

curl命令行输出

   $ curl -v -H "Content-type:application/vnd.api+json" -H "Accept: application/json" -H 'Authorization: WSSE profile="UsernameToken"' -H 'X-WSSE: UsernameToken Username="system", PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=", Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00"' http://orocampus.tk/app.php/api/contacts/2

   Trying 45.76.122.100...
   TCP_NODELAY set
   Connected to orocampus.tk (45.76.122.100) port 80 (#0)
   > GET /app.php/api/contacts/2 HTTP/1.1
   > Host: orocampus.tk
   > User-Agent: curl/7.54.0
   > Content-type:application/vnd.api+json
   > Accept: application/json
   > Authorization: WSSE profile="UsernameToken"
   > X-WSSE: UsernameToken Username="system", PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=", Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00"
   > 
   < HTTP/1.1 200 OK
   < Server: nginx/1.13.3
   < Date: Wed, 30 Aug 2017 00:17:17 GMT
   < Content-Type: application/vnd.api+json
   < Transfer-Encoding: chunked
   < Cache-Control: no-cache
   < Set-Cookie: SERVERID=web2; path=/
   < 
   * Connection #0 to host orocampus.tk left intact

php输出

$ php test.php 
array(4) {  
[0]=>
string(37) "Content-type:application/vnd.api+json"
[1]=>
string(24) "Accept: application/json"
[2]=>
string(43) "Authorization: WSSE profile="UsernameToken""
[3]=>
string(157) "X-WSSE: UsernameToken Username="system",      PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=", Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00""
}
*   Trying 45.76.122.100...
* TCP_NODELAY set
* Connected to orocampus.tk (45.76.122.100) port 80 (#0)
> GET /app.php/api/contacts/2 HTTP/1.1
Host: orocampus.tk
User-Agent: curl/7.54.0
Content-type:application/vnd.api+json
Accept: application/json
Authorization: WSSE profile="UsernameToken"
X-WSSE: UsernameToken Username="system",     PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=",  Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00"

< HTTP/1.1 401 Unauthorized
< Server: nginx/1.13.3
< Date: Wed, 30 Aug 2017 00:16:53 GMT
< Content-Type: application/json
< Transfer-Encoding: chunked
< Cache-Control: no-cache
< WWW-Authenticate: WSSE realm="Secured API", profile="UsernameToken"
< Set-Cookie: SERVERID=web2; path=/
< 
* Connection #0 to host orocampus.tk left intact
string(277) "HTTP/1.1 401 Unauthorized
Server: nginx/1.13.3
Date: Wed, 30 Aug 2017 00:16:53 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Cache-Control: no-cache
WWW-Authenticate: WSSE realm="Secured API", profile="UsernameToken"
Set-Cookie: SERVERID=web2; path=/

我试过在php中运行curl。它也失败了

    function request($path) {
    $curl = "curl -v -H \"Content-type:application/vnd.api+json\" -H \"Accept: application/json\" -H 'Authorization: WSSE profile=\"UsernameToken\"'".
        " -H ".$this->getHeader()[3]."' " . $this->_url . $path;

    var_dump($curl);
    exec($curl, $output, $exit);
    var_dump($output);
    return $exit == 0;
}

如果我在终端中运行相同的curl命令,它可以正常工作。问题是什么?

0 个答案:

没有答案