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"
我正在尝试使用带有 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"