设定HTTP请求的"Content-Type"

9
如何设置HTTP请求的内容类型?
我尝试了以下方法:
$headers['Accept'] = 'application/xml';
$headers['Content-Type'] = 'application/xml';

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

而这是结果:

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html;charset=UTF-8
Date: Thu, 22 Mar 2012 14:04:36 GMT

但到目前为止没有运气...
我需要做什么来在我的HTTP响应中获得 Content-Type: application/xml?


是的,我知道,但我需要在请求中设置什么才能获得Content-Type: application/xml响应? - Michiel
你提供的结果是一个HTTP响应而不是请求。你是在问如何设置请求的内容类型,还是在问如何要求服务器在响应中提供XML? - Quentin
你需要设置Accept头(而不是content-type头)。然后服务器需要支持多种响应类型,并使用accept头来确定使用哪种类型。你知道服务器是否这样做了吗? - Quentin
我想知道在我的请求中需要设置什么,才能在我的响应中有一个 Content-Type: application/xml - Michiel
@Quentin,我设置了Accept头,对吧? - Michiel
看起来是这样,但服务器会注意到它吗? - Quentin
2个回答

29

我认为头信息必须是一个纯数组,其元素是完整的键:值头信息,而不是关联数组:

$headers = array();
$headers[] = 'Accept: application/xml';
$headers[] = 'Content-Type: application/xml';

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

这在curl_setopt()文档中有说明。


谢谢您的尝试,但结果仍然相同。我需要清除一些东西吗?比如Cookies、缓存等。 - Michiel
那是HTTP响应吗?你在请求中发送了content-type头。这并不意味着响应服务器会发送相同的content-type。 - Michael Berkowski
我已经在 WizTools 中尝试了相同的请求,服务器返回了 application/xml Content-Type,因此服务器能够发送正确的响应。只有当我尝试使用自定义 PHP 时,我无法发送 Content-Type 设置... - Michiel

2
您为请求设置了一个接受类型(使用Michael的答案),您应该将他的答案视为回答直接问题,但这并不意味着服务器必须以那种内容类型响应。
如果请求的另一端是静态文件,则必须确保您的Web服务器以application/xml的MIME类型发送该文件。如果文件以.xml结尾,则Apache和IIS都会自动执行此操作。如果它是其他非标准文件扩展名,但您希望将其作为application/xml发送,则需要让服务器管理员设置httpd.conf或.htaccess以添加文件的mime类型。在IIS中,您可以使用GUI管理工具执行相同的操作,为文件扩展名添加mime类型,例如application/xml。
如果请求的另一端是服务器端脚本语言,例如PHP、Perl、Python、ColdFusion、ASP、ASP.net等,则需要在调用的脚本中使用适当的方法/函数来发出内容类型头并将其设置为application/xml。
更新:您在评论中说您正在使用WizTools发送请求并获得了application/xml的响应。如果您想克隆该环境,则需要在curl请求中发送它发送的所有标头。猜测之一是用户代理可能会影响结果。

感谢您提供这个有价值的答案。所以,请求本身是没问题的,是服务器出了问题,对吗? - Michiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接