卷曲问题:同样的要求,不同的回应

时间:2018-04-14 11:50:39

标签: php http curl guzzle

这是一个问题。

我需要向API发送请求,并从响应中获取字符串。 在这种特殊情况下,我想得到一个字符串“订单已经取消”

首先,我在邮差中查了一下。它在那里工作正常。 在那之后,我写了一个PHP代码,使用GuzzleHttp包来发出请求。 但是我第一次面临这个问题。

响应的标题为“Content-Length:4”,看起来身体是空的。 当我试图调用$ response-> getBody();

时,这就是为什么我得到NULL的原因

然后我在调试模式下运行GuzzleHttp以查看原始的http请求/响应并与Postman进行比较。

一般来说,它们之间没有区别,除了一些不重要的标题,如“User-Agent”,“Accept-Encoding”和“Postman-Token”。

我认为问题出在GuzzleHttp上,我用干净的内置卷曲函数重写了代码。

$basic_auth_base64 = base64_encode("{$this->_http_auth_login}:{$this->_http_auth_pass}");

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "{$this->_base_url}{$uri}?" . http_build_query($params),
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Authorization: Basic $basic_auth_base64",
    "Cache-Control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);        
curl_close($curl);

然后我遇到了同样的问题!来自带有标题的API的错误空响应:

Content-Type: application/json; charset=UTF-8
Content-Length: 4

但我需要得到像:

这样的回复
Content-Type: text/html
Content-Length: 23

我甚至用curl的bash检查了这个请求,它运行正常!

curl -X GET \
  'http://website-server.com/api/order/delete/?OrderId=6693' \
  -H 'Accept: */*' \
  -H 'Accept-Encoding: deflate, gzip' \
  -H 'Authorization: Basic base64LoginAndPass' \
  -H 'Cache-Control: no-cache' \
  -H 'User-Agent:' -v

我从api得到了很好的回复,所以问题只出在我的php代码和环境中。

以下是curl的日志。从bash curl和php curl:

bash curl:

*   Trying 82.236.10.100...
* TCP_NODELAY set
* Connected to website-server.com (82.236.10.100) port 80 (#0)
> GET /api/order/delete/?OrderId=6693 HTTP/1.1
> Host: website-server.com
> Accept: */*
> Accept-Encoding: deflate, gzip
> Authorization: Basic base64LoginPassword
> Cache-Control: no-cache
> 
< HTTP/1.1 200 OK
< Server: nginx-reuseport/1.13.4
< Date: Fri, 13 Apr 2018 17:04:27 GMT
< Content-Type: text/html
< Content-Length: 23
< Connection: keep-alive
< Keep-Alive: timeout=30
< X-Powered-By: PHP/5.6.30
< 
* Connection #0 to host website-server.com left intact
order already cancelled    

php curl:

*   Trying 82.236.10.100...
* TCP_NODELAY set
* Connected to website-server.com (82.236.10.100) port 80 (#0)
> GET /api/order/delete/?OrderID=6693 HTTP/1.1
Host: website-server.com
Accept: */*
Accept-Encoding: deflate, gzip
Authorization: Basic base64LoginPassword
Cache-Control: no-cache

< HTTP/1.1 200 OK
< Server: nginx-reuseport/1.13.4
< Date: Fri, 13 Apr 2018 16:44:59 GMT
< Content-Type: application/json; charset=UTF-8
< Content-Length: 4
< Connection: keep-alive
< Keep-Alive: timeout=30
< X-Powered-By: PHP/5.6.30
< 
* Curl_http_done: called premature == 0
* Connection #0 to host website-server.com left intact

如您所见,这是一个完全相同的请求!但不同的回应! 主要区别是标题“Content-Type:application / json; charset = UTF-8”和响应的正文。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

我不知道可能的原因,但我会尝试推荐如何调试。

您看到相同的请求会产生不同的结果。现在让我们做出一个合理的假设:我们可以非常肯定服务器将返回完全相同的结果如果请求真的完全相同。

到目前为止,您只是相信来自PHP和CURL的查询是相同的。我不确定CURL和PHP CURL究竟是如何编写日志的(即我不确定如何将它们配置为记录所有标题)。

值得注意的是,看看CURL和PHP CURL使用请求发送的标头会很有趣。我会使用tcpdump或Wireshark记录网络流量。我确信这些请求将变成相同。