引自免费微信小程序:皆我百晓生
遇到Safari浏览器通过Fetch API提交数据到PHP服务端时丢失的问题,可能是由于几个原因造成的,包括但不限于HTTP头部的设置、Safari对某些特性的支持差异、以及服务器端处理数据的方式。下面是一些可能的解决方案和优化建议:
1. 确保Content-Type正确设置
在您的Fetch请求中,您已经设置了Content-Type
为text/plain
。对于JSON数据,更常见的做法是设置为application/json
。这有助于服务器正确解析请求体内容。修改请求头如下:
headers: {'Content-Type': 'application/json'},
2. PHP端接收数据方式
您当前使用了stream_socket_accept
和fread
来接收数据,这种方式在处理HTTP请求时可能会遇到问题,特别是当涉及到更复杂的HTTP头部解析时。考虑使用更高级的PHP功能,比如$_POST
全局变量(适用于表单编码的数据)或者通过解析原始输入流(适合任意类型的数据,包括JSON)。对于JSON数据,可以这样做:
$data = file_get_contents('php://input');
$prompt = json_decode($data, true);
这段代码直接从输入流读取原始数据,然后尝试将其解码为JSON。
3. 检查Safari的同源策略和CORS设置
确保您的服务器正确设置了CORS(跨源资源共享)头部,允许来自移动端App的域名发起请求。Safari对CORS的实现可能比其他浏览器更为严格。一个基本的CORS响应头配置如下:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST");
header("Access-Control-Allow-Headers: Content-Type");
4. 错误处理和日志记录
在PHP端增加详细的错误处理和日志记录,可以帮助诊断问题。例如,检查是否有错误信息被输出,或者在解析JSON时是否捕获到了异常。
$prompt = json_decode($data, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("JSON decode error: " . json_last_error_msg());
exit;
}
5. 验证网络环境和重试机制
在移动设备上,网络环境可能不稳定。考虑在客户端实现一个简单的重试逻辑,如果初次请求失败,则尝试再次发送。
总结
- 修改
Content-Type
为application/json
。 - 使用
file_get_contents('php://input')
替代fread
来接收JSON数据。 - 确认CORS设置正确。
- 增加错误处理和日志记录。
- 考虑网络不稳定因素,实施重试逻辑。
请尝试上述修改并观察是否解决了数据丢失的问题。如果问题依旧存在,可能需要进一步分析网络传输日志或者查看服务器端的日志详情,以获取更具体的错误信息。