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
相关产品推荐
相关产品推荐

