【问题标题】:Custom curl CURLOPT_HTTPHEADER with result [Authentication-API-Key] => 123456自定义 curl CURLOPT_HTTPHEADER 结果 [Authentication-API-Key] => 123456
【发布时间】:2015-01-08 18:44:58
【问题描述】:

http 连接需要带有自定义标头对象 Authentication-API-Key 的 HTTP POST 请求

使用 CURL,它会自动转换为 [HTTP_AUTHENTICATION_API_KEY] => 12345 不知道为什么

一个用于测试的 php 类的简单摘录是

请帮帮我,如何使用 [Authentication-API-Key] => 123456 获得 $_SERVER 结果

<?php
    $contentType = 'text/xml';
    $method = 'POST';
    $auth = '';
    $header1 = 'Authentication-API-Key: 12345';
    $charset= 'ISO-8859-1';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/test/returnurl.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Content-type: ' . 
                $contentType . '; charset=' . $charset,
                $header1));
curl_exec($ch);

?>

<?php
//http://localhost/test/returnurl.php
Print_r($_SERVER,true)
?>

输出:

大批 ( [HTTP_HOST] => 本地主机 [HTTP_ACCEPT] => */* [内容类型] => 文本/xml;字符集=ISO-8859-1 [HTTP_AUTHENTICATION_API_KEY] => 12345 ... )

【问题讨论】:

  • header2 似乎未定义,可能是问题所在?
  • 您是否尝试过使用get_headers 而不是$_SERVER 来读取标题?

标签: php curl


【解决方案1】:

如果我运行你的代码,我会收到 $header2 未定义的消息,所以我认为你需要修复它。 如果我删除$header2,这是输出:

GET /test/returnurl.php HTTP/1.1
Host: localhost
Accept: */*
Content-type: text/xml; charset=ISO-8859-1
Authentication-API-Key: 12345

所以这似乎没问题。你的输出是什么?请注意,当前请求是使用 GET 发送的,而不是 POST。

编辑:我创建了脚本/test/returnurl.php,它只是转储$_SERVER 数组,现在我明白你的意思了。它在接收端结束的事实并不意味着您没有正确设置标头,因此您正在使用的服务应该按预期接收它。

【讨论】:

  • 问题不在于 var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));但是目标 url 数组中的 var_dump($_SERVER) ( [HTTP_HOST] => localhost [HTTP_ACCEPT] => / [CONTENT_TYPE] => text/xml; charset=ISO-8859-1 [HTTP_AUTHENTICATION_API_KEY ] => 12345
  • 我也更新了我的答案;但我不认为它最终出现在 $_SERVER 数组中这一事实意味着您没有正确设置标题。
  • 他们也以 HTTP_AUTHENTICATION_API_KEY 的形式接收它
  • 它是否适用于使用其 API 的其他用户?他们使用 PHP 的 curl 吗?
  • 他们不使用 PHP 作为平台,只有我一个。客户向我解释说,他们以前从未收到过这个问题,并且所有客户都将其正确发送为 [Authentication-API-Key] => 12345
【解决方案2】:

_SERVER 就是这样工作的;它不会逐字提供 HTTP 标头键。

这不是 CURL 做的。检查实际 HTTP 请求,您会发现您的标头没有问题。

另一个例子是$_SERVER['CONTENT_TYPE'],它为您提供Content-Type HTTP 标头的值。

这里没有问题。

【讨论】:

    【解决方案3】:

    我正在使用的脚本传递一个数组,如 array("Content-type: image/png")。

    也许通过将它放在一个数组中,可以防止它在 :

    我是 cURL 的新手,所以我什至还不能测试这个理论..

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2021-07-09
      相关资源
      最近更新 更多