Swift:URLRequest发送POST请求时JSON被作为键传入后端的问题
问题成因及修复方案
问题根源
问题出在没有给POST请求设置Content-Type请求头为application/json。
当后端接收到未指定Content-Type的请求时,通常会默认按application/x-www-form-urlencoded(表单提交格式)解析请求体。这种格式下,后端会把你发送的整个JSON字符串识别成一个表单字段的键,由于没有对应的字段值,就出现了你看到的「JSON字符串作为键、值为空」的异常结果。
修复代码
修改你的PostRequest函数,添加Content-Type请求头即可解决问题,同时建议优化URL的强制解包避免崩溃:
func PostRequest<In:Codable>(object: In, endpoint: String){ do{ guard let url = URL(string: "http://localhost:8080/\(endpoint)/") else { print("Invalid URL") return } var request = URLRequest(url: url) request.httpMethod = "POST" // 关键:告知后端请求体为JSON格式 request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = try JSONEncoder().encode(object) URLSession.shared.dataTask(with: request) {data, response, error in guard let data = data, error == nil else{ print(error?.localizedDescription ?? "No Data") return } if let jsonResponse = try? JSONSerialization.jsonObject(with: data, options: []), let responseDict = jsonResponse as? [String: Any] { print(responseDict) } }.resume() }catch{ print(error) } }
额外说明
- 设置
Content-Type后,后端会明确识别请求体格式为JSON,就能正确解析你传入的结构体数据。 - 替换
url!为guard let是为了处理URL构造失败的场景(比如endpoint包含非法字符),避免触发运行时崩溃。
内容的提问来源于stack exchange,提问作者hugh19se
相关产品推荐
相关产品推荐

