lhdwh 2024-04-27 23:14 采纳率: 0%
浏览 9
已结题

safari浏览器fetch提交数据后数据丢失问题

目前有个项目,是在移动端app里嵌套了一个H5页面,从这个H5页面向PHP搭建的一个简单的流式服务提交数据,使用的是fetch提交的,

部分代码如下:


```javascript
method: 'post',
headers: {'Content-Type': 'text/plain'},
body: JSON.stringify({'a': '123'})

目前安卓端基本没问题,ios端提交数据后,在php那里大概率会接收不到这个数据,部分代码如下:


```php
if (stream_select($read, $write, $except, 10)) {
        $client = stream_socket_accept($server);
        // 获取客户端发来的数据
        $data = fread($client, 4000);
        $postData = '';
        if (preg_match("/\r\n\r\n(.*)/s", $data, $match)) {
            $postData = $match[1];
        }
        // 解析 POST 参数, 请求大模型服务
        $prompt = json_decode($postData,true);

跟踪发现最后的$prompt经常会是空,这是不是safari的问题,因为安卓下基本正常,求高人指教。

  • 写回答

28条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-27 23:14
    关注
    获得1.00元问题酬金

    引自免费微信小程序:皆我百晓生

    遇到Safari浏览器通过Fetch API提交数据到PHP服务端时丢失的问题,可能是由于几个原因造成的,包括但不限于HTTP头部的设置、Safari对某些特性的支持差异、以及服务器端处理数据的方式。下面是一些可能的解决方案和优化建议:

    1. 确保Content-Type正确设置

    在您的Fetch请求中,您已经设置了Content-Typetext/plain。对于JSON数据,更常见的做法是设置为application/json。这有助于服务器正确解析请求体内容。修改请求头如下:

    headers: {'Content-Type': 'application/json'},
    

    2. PHP端接收数据方式

    您当前使用了stream_socket_acceptfread来接收数据,这种方式在处理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-Typeapplication/json
    • 使用file_get_contents('php://input')替代fread来接收JSON数据。
    • 确认CORS设置正确。
    • 增加错误处理和日志记录。
    • 考虑网络不稳定因素,实施重试逻辑。

    请尝试上述修改并观察是否解决了数据丢失的问题。如果问题依旧存在,可能需要进一步分析网络传输日志或者查看服务器端的日志详情,以获取更具体的错误信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月5日
  • 创建了问题 4月27日

悬赏问题

  • ¥15 武汉岩海低应变分析软件,导数据库里不显示波形图
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。
  • ¥30 win c++ socket
  • ¥15 CanMv K210开发板实现功能
  • ¥15 C# datagridview 栏位进度
  • ¥15 vue3页面el-table页面数据过多
  • ¥100 vue3中融入gRPC-web
  • ¥15 kali环境运行volatility分析android内存文件,缺profile
  • ¥15 写uniapp时遇到的问题
  • ¥15 vs 2008 安装遇到问题