JSON 内的请求正文 JSON

Request body JSON inside JSON

我正在尝试使用带有 express 和 body-parser 的 Node 和 Swift 来做一个 iOS 应用程序 Swift。

在我的应用程序中,我对具有用户名和密码的对象进行编码,如下所示:

try? JSONEncoder().encode(requestParams)

requestParams 对象是这个:

import Foundation

struct UserRequestParams: Codable {
    var username: String
    var password: String
}

这是我创建请求的方式。

let request = RequestBuilder.host("localhost:3000")
    .post()
    .headers(["Content-Type": "application/x-www-form-urlencoded"])
    .encoded(.body)
    .parameter(params)
    .path("auth")

这是请求:

func execute<T: Decodable>(request: HttpRequest, responseType: T.Type) -> AnyPublisher<T, Error> {
    var urlComponents = URLComponents(string: request.stringURL)!

    if let data = request.parameter?.toJson(), request.encoded == .url {
        var queryItems = [URLQueryItem]()
        for (key,param) in data {
            queryItems.append(URLQueryItem(name: key, value: param as? String))
        }

        urlComponents.queryItems = queryItems
    }

    let url = urlComponents.url!

    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = request.method.rawValue

    if request.encoded == .body {
        urlRequest.httpBody = try? JSONEncoder().encode(request.parameter)
    }

    for header in request.headers {
        urlRequest.setValue(header.value, forHTTPHeaderField: header.key)
    }

    return URLSession.shared.dataTaskPublisher(for: urlRequest)
    .tryMap { output in
        guard let response = output.response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
            throw RepositoryError.serverError
        }
        return output.data
    }
    .receive(on: RunLoop.main)
    .decode(type: responseType.self, decoder: JSONDecoder())
    .eraseToAnyPublisher()
}`

所以我认为它工作正常,问题出在服务器端我收到这个请求正文:

body: { '{"username":"****","password":"****"}': '' }

服务器似乎已经将应用 json 包装到另一个 json。

"application/x-www-form-urlencoded" 要求正文 username=****&password=**** 如果你想要 JSON 使用 "application/json"