You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Safari浏览器使用Fetch API发送POST请求时丢失请求体问题

问题:Safari下Fetch发送POST请求无请求体,服务器仅收到请求头

更新:经排查,该问题仅出现在Safari浏览器,Chrome和Firefox无此情况

该问题已在网络上多次被提及,但CORS、Content-Type等常规解决方案均无效。为定位问题,我使用一个极简Python“服务器”(基于原始TCP Socket)进行测试:

def handle_request(request):
    print( "REQUEST TO HANDLE")
    print( request)
    if request.startswith("GET /checkdo.html HTTP/1.1"):
        if checkdo is not None:
            response = "HTTP/1.1 200 OK\r\n"
            response += "Content-Type: text/html\r\n"
            response += "Content-Length: {}\r\n".format(len(checkdo))
            response += "\r\n" + checkdo
        else:
            response = "HTTP/1.1 404 Not Found\r\n\r\n"
            response += "No data found for the token."
    elif request.startswith("POST /checkdo-post HTTP/1.1"):
        token = extract_token(request)
        if is_authorized(token):
            data = request.split("\r\n")[-1]
            print( "DATA")
            print( data)

            store_data(token, data)

            response = "HTTP/1.1 200 OK\r\n\r\n"
            response += "Data saved successfully!"
        else:
            response = "HTTP/1.1 403 Forbidden\r\n\r\n"
            response += "Unauthorized access!"
    else:
        response = "HTTP/1.1 404 Not Found\r\n\r\n"
    return response

def start_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('', 8080)
    server_socket.bind(server_address)
    server_socket.listen(1)
    print("Server listening on port 8080...")

    while True:
        client_socket, client_address = server_socket.accept()
        print("Received connection from:", client_address)

        rawrequest = client_socket.recv(4096)
        print( "RECEIVE")
        print( rawrequest)
        request = rawrequest.decode('utf-8')

        response = handle_request(request)

        print( "RESPOND")
        print( response)
        client_socket.sendall(response.encode('utf-8'))

        client_socket.close()

if __name__ == "__main__":
    start_server()

该服务器的GET请求可正常响应,但当网页中通过JavaScript的Fetch API发送POST请求时:

const saveToServer = (remindersToSave) => {
    const myHeaders = new Headers();
    const myToken = getToken();
    myHeaders.append( "Accept", "application/json");
    myHeaders.append( "Content-type", "application/json; charset=UTF-8");
    //myHeaders.append( "Content-type", "application/x-www-form-urlencoded");
    myHeaders.append( "Authorization", myToken);
    const myURL = window.location.protocol + "//" + window.location.host + "/checkdo-post";
    const myData = JSON.stringify(remindersToSave);
    console.log( "POST: " + myURL);
    console.log( "DATA: " + myData);
    (async () => {
        const rawResponse = await fetch(myURL, {
            method: 'POST',
            headers: myHeaders,
            body: myData
        });
        console.log(rawResponse);
    })();
}

浏览器控制台显示已准备好发送指定数据,但Python服务器端收到的请求中无请求体,仅能看到请求头,Content-Length标注为171但无对应数据。

而使用curl命令:

curl -i -X POST -H 'Content-Type: application/json' -d '{"name": "New item", "year": "2009"}' http://localhost:8080/checkdo-post

发送相同类型的POST请求时,服务器可正常接收请求体并处理。由此可确定问题出在Safari浏览器,但目前尚未找到解决办法。

内容的提问来源于stack exchange,提问作者gctwnl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:50:06