我遇到了一个我不完全理解的奇怪问题。我的Web服务器通过PHP调用PHP api。其余的api会根据动词将请求路由到photos.php文件中的相应函数。 GET,PUT和DELETE请求都可以正常工作,但是下面的POST请求返回404 Not found。问题是它可以从浏览器或从Postman调用它时工作得很好。该文件绝对存在并具有适当的访问权限。我也没有遇到其他POST请求的问题。
经过大约5个小时的战斗并阅读了100个网站/文章后,我偶然发现了对#34; ignore_errors"的" stream_context_create选项的模糊引用。 =>真正。在我添加该行的那一刻,404消失了,我可以到达api端点。
我不明白这是怎么回事。该文件要么存在,要么就不存在,所以404就是谎言。我不想忽略错误以使其发挥作用。知道这里发生了什么吗?
$apiUrl = 'http://localhost/api/v1/user/john/photos';
// Setup http request
$options = ["http" =>
["method" => "POST",
"header" => "Content-Type: application/json",
"ignore_errors" => true,
"content" => $data
]
];
// Call API
$apiResponse = file_get_contents($apiUrl, NULL, stream_context_create($options));
以下是我收到的错误:
<b>Warning</b>: file_get_contents(http://localhost/api/v1/user/john/photos): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
卷曲信息:
Array
(
[url] => http://localhost/api/v1/user/john/photos
[content_type] => text/html; charset=UTF-8
[http_code] => 404
[header_size] => 214
[request_size] => 147
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.015
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 229
[speed_download] => 15266
[speed_upload] => 0
[download_content_length] => 229
[upload_content_length] => -1
[starttransfer_time] => 0.015
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 127.0.0.1
[certinfo] => Array
(
)
[primary_port] => 80
[local_ip] => 127.0.0.1
[local_port] => 53224
)
Header Info: HTTP/1.1 404 Not Found
Date: Fri, 28 Oct 2016 15:14:23 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
X-Powered-By: PHP/5.6.21
Content-Length: 229
Connection: close
Content-Type: text/html; charset=UTF-8
答案 0 :(得分:0)
如果您正在寻找为什么file_get_contents在没有将ignore_errors设置为true的情况下抛出错误的答案,那么这些说明可能会让您更接近答案。请注意这些说明假设php错误日志尚未经过审核或尚无用,希望能帮助您解决这些问题。
要找到您的php错误日志,请将其放在脚本的顶部(暂时只对页面加载一次)
<强>的phpinfo();模具(); 强>
现在,在该页面加载并且您看到您的php信息后,搜索 error_log 并在您的主机上找到该目录。
如果该值为空,则可能关闭了log_errors,或者错误正在打印到您的apache错误日志中。如果是这种情况,请尝试查找apache错误日志。
使用错误日志,替换 phpinfo(); die(); 这两个调用。关闭ignore_errors并再次运行该文件。
<强>的error_reporting(E_ALL); ini_set(“display_errors”,1);
使用错误日志,您是否可以找到与file_get_contents调用相关的通知/警告/错误,如果他们没有解决问题,可以在此处发布?
**编辑**
好的,请使用curl,完整地获取响应和请求标题,并使用输出更新您的问题。
ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// ...
$response = curl_exec($ch);
// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);