【问题标题】:PHP cURL Content-Type not setPHP cURL Content-Type 未设置
【发布时间】:2020-09-30 21:59:30
【问题描述】:

我正在整个互联网上尝试所有解决方案,但我无法获得它。

我正在尝试使用 php curl 连接到发送 json 数据的外部 API,但我无法设置 content_type。

$url = "https://example.com:xxxx/api/example";

$data = array(
    'example' => '1',
    'example2' => '2'
);
$jsonData = json_encode($data);

$ch = curl_init($url);

if(extension_loaded('curl') == true){
    echo('Curl is active<br/>');
} else {
    echo('Curl is NOT active<br/>');
}

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type:application/json',
    'Connection: Keep-Alive'
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 300); //timeout in seconds
$result = curl_exec($ch);


echo('<hr/>');
var_dump(curl_getinfo($ch));
echo('<br/>');
echo curl_errno($ch) . '<br/>';
echo curl_error($ch) . '<br/>';
echo('<hr/>');


curl_close($ch);

echo('<br/>Response: ');
var_dump($result);

回复:

Curl 有效

array(26) { ["url"]=> string(66) "https://example.com:port/api/example" ["content_type"]=> NULL ["http_code"]=> int(0) ["header_size"]=> int(0) ["request_size"]=> int(0) ["filetime"]=> int(-1) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) [ "total_time"]=> float(0.467581) ["namelookup_time"]=> float(0.004158) ["connect_time"]=> float(0) ["pretransfer_time"]=> float(0) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(-1) [ "upload_content_length"]=> float(-1) ["starttransfer_time"]=> float(0) ["redirect_time"]=> float(0) ["redirect_url"]=> string(0) "" ["primary_ip" ]=> string(0) "" ["certinfo"]=> array(0) { } ["primary_port"]=> int(0) ["local_ip"]=> string(0) "" ["local_port" ]=> int(0) }

7

无法连接到https://example.com 端口 xxx:连接被拒绝

响应:bool(false)

...

如果我通过 SoapUi 尝试:

HTTP/1.1 200 变化:起源 变化:访问控制请求方法 变化:访问控制请求标头 变化:起源 变化:访问控制请求方法 变化:访问控制请求标头 X-Content-Type-Options: nosniff X-XSS-防护:1;模式=块 缓存控制:无缓存,无存储,最大年龄=0,必须重新验证 Pragma:无缓存 过期:0 严格的传输安全性: max-age=31536000 ;包括子域 X-Frame-选项:拒绝 内容类型:text/plain;charset=UTF-8 内容长度:42 日期:格林威治标准时间 2020 年 6 月 11 日星期四 09:29:46 保活:超时=60 连接:保持活动

正确回答

但我需要在 php 上做。有什么帮助吗?

【问题讨论】:

  • curl_getinfo 默认会告诉你(大部分)关于响应的信息,而不是请求。 manual 表示请求文档的内容类型值:Content-Type:。 NULL 表示服务器没有发送有效的 Content-Type: header 。因此,您看到的内容类型是远程服务器在其响应中提供的(或未提供,在这种情况下!),而不是在您的请求中。如果您想查看传出请求中设置了哪些标头,请尝试以下操作:stackoverflow.com/a/24148421/5947043
  • 无论如何,“连接被拒绝”错误几乎肯定与您的内容类型标头无关。服务器并没有为此烦恼,它只是拒绝在套接字级别接受您的任何类型的连接。您更有可能遇到防火墙问题,或者 cURL 和 SSL/HTTPS 存在某种问题。
  • 谢谢@ADyson。我尝试将我的请求作为您共享的链接,它返回给我 NULL。可能防火墙问题或 SSL 是关键
  • @MarkusZeller 您可以提供该要求的参考吗?我找不到任何指定的内容。无论如何,它与 OP 的实际错误并不真正相关
  • @MarkusZeller 确定,但语法指南实际上并没有说您 必须 留一个空格。 developer.mozilla.org/en-US/docs/Web/HTTP/Headers“HTTP 标头由其不区分大小写的名称后跟冒号 (:),然后是其值组成。忽略值之前的空格” ...所以基本上这是在说任何空格都是可选的,不予考虑。

标签: php api web-services curl


【解决方案1】:

这是关于 https,现在我明白了:

Response: string(34) "xxxxxxxxxxxxxxxxx"

感谢@ADyson

【讨论】:

  • 那么为了让它发挥作用,你做了什么改变?为了他人的利益,请分享。
  • 尝试在 https 域和不同的服务器上使用相同的脚本。我以前在没有 https 的域上使用过。
猜你喜欢
  • 2013-11-07
  • 2021-12-22
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2014-03-06
  • 2011-05-24
相关资源
最近更新 更多