首页 > 解决方案 > 在 Swift 中解析的 JSON HTTP 请求有效负载被 Express 解释为 JSON 对象中的单个键——为什么?

问题描述

我正在使用 Swift 在 iOS 应用程序中处理一些网络代码,并且遇到一个问题,即Codable结构被不正确地解析为 JSON,这样整个对象都被用作键

我的Codable名为 UserForLogin 的结构被解析为登录请求的正文。该结构具有以下代码:

struct UserForLogin: Encodable, Equatable {
    let email: String
    let password: String
    
    init(email: String, password: String) {
        self.email = email
        self.password = password
    }
}

signIn看起来像这样:

func signIn(with data: UserForLogin) -> AnyPublisher<UserLoginDTO?, Error> {
        return gcNetworkService.post(to: AuthModuleEndpoint.signin, data: data, with: [])
            .tryMap { userWithToken -> UserLoginDTO in
                return userWithToken
            }.mapError { error in
                return error
            }.eraseToAnyPublisher()
    }

并且该.post方法本质上调用了另一个send包含以下代码片段的方法:

var request = createURLRequest(for: requestURL)
request.httpMethod = method 

let requestData = try? JSONEncoder().encode(data)
        
request.httpBody = requestData
        
return session.dataTaskPublisher(for: request)

但是,当我进行此调用时,我的后端收到的请求正文是:

{ '{"email":"test","password":"test2"}': '' }

本质上,整个对象被解析为一个 JSON 键,而不是像它应该的那样将每个变量作为键,将值作为值等。

对于上下文,当通过 Postman 发送请求时,我在后端成功处理了请求,所以我认为这不是服务器端问题。

任何指导将不胜感激!

标签: jsonswiftresthttpencoding

解决方案


感谢 Jacob 指出我错过了这一行:

request.addValue("application/json", forHTTPHeaderField: "Content-Type")

这解决了问题。


推荐阅读