【发布时间】: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