php curl和CURLOPT_FOLLOWLOCATION行为

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

情况是这样的。一方面,我们有一个服务器,带有RESTful服务。一个可能的查询是创建对象的POST查询。完成此操作后,服务器将返回一个“Location”头,以指示在何处可以找到新创建的对象的信息。 然而,所述服务器对于每个请求是否具有正确的内容类型并不确定。例如,POST需要'application/json',GET需要将其取消设置(这是有意义的,因为GET没有正文)

总之,我们有:

  • www.example.com/articles/;您可以使用
    'Content-Type:application/json'
    发送POST请求,如果
    123
    是新对象的
    id
    ,服务器将返回
    'Location:www.example.com/articles/123'

  • www.example.com/articles/123;您可以发送一个不带
    'Content-Type'
    GET请求,服务器将返回新文章对象的描述

在客户端,我们将PHPcURL一起使用。我们使用
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'
    检查? (听起来很傻)
  • 忘记
    CURLOPT\u FOLLOWLOCATION
    ,发出两个明确分开的curl请求,这样我就可以控制头了?(那么,
    CURLOPT\u FOLLOWLOCATION
    有什么意义呢?)
  • 还有别的吗
对于控制和测试,我还使用了Postman,我对此没有问题,它遵循位置,在重定向后不发送GET部分上的
'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."