iOS 15 Swift 发起POST请求时JSON Body编码异常问题
问题根因
你没有为请求设置正确的Content-Type请求头。
HTTP协议要求请求体的格式必须和Content-Type头声明的类型一致,服务端会根据这个头的值选择对应的解析逻辑。你没有手动设置该头时,服务端会默认按照application/x-www-form-urlencoded(普通表单格式)解析请求体:这种格式要求键值对用=连接、多个键值对用&分隔,你传入的序列化后JSON字符串里没有=符号,服务端就会把整段JSON字符串识别为键名,对应值为空,正好和你看到的服务端接收结果一致。
排查思路
- 先核对请求头的
Content-Type值是否和实际发送的请求体格式匹配:发送JSON体时必须声明为application/json,不要依赖默认值。 - 本地打印序列化后的请求体验证序列化逻辑是否正常:可以用
String(data: bodyData!, encoding: .utf8)将二进制body转成字符串输出,就能确认JSON序列化本身没有生成错误格式。 - 必要时通过抓包工具查看实际发出的请求原始数据,确认请求头没有被业务逻辑意外覆盖、请求体没有被二次转义或重复编码。
修复方案
在设置httpBody前,手动给请求加上JSON对应的Content-Type头即可,修正后的完整代码如下:
var request = URLRequest(url: url) let body = [ "email": "abc@gmail.com", "password": "123456" ] // 不要用try?直接吞掉序列化错误,方便后续排查问题 guard let bodyData = try? JSONSerialization.data( withJSONObject: body, options: [] ) else { // 在这里处理JSON序列化失败的逻辑 return } request.httpMethod = "POST" // 核心:声明请求体为JSON格式 request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = bodyData
注意:不要对已经序列化完成的JSON二进制数据再做表单格式编码、百分号转义等额外处理,否则会出现JSON内容被转义、服务端无法正常解析的问题。
内容的提问来源于stack exchange,提问作者mix0lydian
相关产品推荐
相关产品推荐

