php curl和CURLOPT_FOLLOWLOCATION行为
情况是这样的。一方面,我们有一个服务器,带有RESTful服务。一个可能的查询是创建对象的POST查询。完成此操作后,服务器将返回一个“Location”头,以指示在何处可以找到新创建的对象的信息。 然而,所述服务器对于每个请求是否具有正确的内容类型并不确定。例如,POST需要'application/json',GET需要将其取消设置(这是有意义的,因为GET没有正文) 总之,我们有:php curl和CURLOPT_FOLLOWLOCATION行为,php,curl,http-headers,content-type,Php,Curl,Http Headers,Content Type,情况是这样的。一方面,我们有一个服务器,带有RESTful服务。一个可能的查询是创建对象的POST查询。完成此操作后,服务器将返回一个“Location”头,以指示在何处可以找到新创建的对象的信息。 然而,所述服务器对于每个请求是否具有正确的内容类型并不确定。例如,POST需要'application/json',GET需要将其取消设置(这是有意义的,因为GET没有正文) 总之,我们有: www.example.com/articles/;您可以使用'Content-Type:applicat
- www.example.com/articles/;您可以使用
发送POST请求,如果'Content-Type:application/json'
是新对象的123
,服务器将返回id
'Location:www.example.com/articles/123'
- www.example.com/articles/123;您可以发送一个不带
的GET请求,服务器将返回新文章对象的描述'Content-Type'
CURLOPT_FOLLOWLOCATION
设置,以便读取新创建对象的描述。显然,我们还为POST请求设置了'Content-Type:application/json'
:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"name": "test"}');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_URL, "https://www.example.com/Articles/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$result=curl_exec($ch);
var_dump($result);
curl_close ($ch);
?>
我查看了服务器的日志,实际上,'Content-Type:application/json'
被发送到www.example.com/articles/123
这是预期的行为吗?如果是,那么最好的方法是什么:
- 删除服务器端GET请求上的
检查? (听起来很傻)'Content-Type'
- 忘记
,发出两个明确分开的curl请求,这样我就可以控制头了?(那么,CURLOPT\u FOLLOWLOCATION
有什么意义呢?)CURLOPT\u FOLLOWLOCATION
- 还有别的吗
'Content-Type'
,因此我没有错误
编辑:
PHP文档中似乎没有什么有用的东西。但我在命令行手册页中发现了一些有趣的东西:
https://curl.haxx.se/docs/manpage.html
它说:
"WARNING: headers set with this option will be set in all requests - even after redirects are followed, like when told with -L, --location."
所以我猜这可能也是PHP的预期行为。那么,有人可以推荐最佳实践吗?您是否尝试过使用
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,“POST”)
设置post类型post字段不应该是
param1=val1&…
格式吗?不一定;这个API理解JSON for instanceThere在PHP文档中似乎没有什么用处。但是我在命令行手册页中发现了一些有趣的东西:是的,这迫使该方法在重定向请求上保持POST,而不是成为GET(这是我想要的),这意味着在www.example.com/articles/123上发布“Content-Type:application/json”。这与我需要的正好相反。
"WARNING: headers set with this option will be set in all requests - even after redirects are followed, like when told with -L, --location."