我正在嘗試發送一個應在 JSON 中包含 URL 引數和請求正文的請求。后端無法識別請求并回傳 400 狀態碼。
這就是我試圖解決問題的方法
enum MyRequestsRouter: URLRequestConvertible {
case RequestA(paramA: String, bodyInJsonString: String),
RequestB(paramB: String)
var baseURL: URL {
URL(string: "http://127.0.0.1:8080")!
}
var method: HTTPMethod {
switch self {
case .RequestA: return .post
case .RequestB: return .get
}
}
var path: String {
switch self {
case .RequestA: return "/api/a"
case .RequestB: return "/api/b"
}
}
var parameters: Parameters? {
switch self {
case .RequestA(let paramA, let bodyInJsonString):
return [
"paramA": paramA
]
case .RequestB(let paramB):
return ["paramB": paramB]
default:
return nil
}
}
func asURLRequest() throws -> URLRequest {
let url = baseURL.appendingPathComponent(path)
var request = URLRequest(url: url)
request.method = method
switch self {
case let .RequestA(paramA, bodyInJsonString):
// here I am specifying `paramA` value
request = try URLEncoding.default.encode(request, with: parameters)
// here body is already serialized to Json
request.httpBody = Data(bodyInJsonString.utf8)
request.setValue("application/json", "Content-Type")
case let .RequestB(paramB):
request = try URLEncoding.default.encode(request, with: parameters)
}
return request
}
}
這就是我進行 API 呼叫的方式
let json: Data = try JSONEncoder().encode(notSerializedBodyObject)
let jsonString = String(data: json, encoding: .utf8)
AF.request(MyRequestsRouter.RequestA(paramA: "paramA", bodyInJsonString: jsonString!)).response { response in
print("Request: \(response.request)")
print("Response: \(response.response)")
print("Error: \(response.error)")
// etc
}
}
如您所見,請求 URL 應該是
http://127.0.0.1:8080/api/a?paramA=paramAJSON 中的請求正文。但回應是 400 Bad request。
如何正確配置 Alomofire?
uj5u.com熱心網友回復:
Alamofire有一個作為引數URLEncoding獲取的初始化程式。destination根據檔案:
Destination定義編碼查詢字串的應用位置。.methodDependent默認。
默認.methodDependent情況下,檢查請求的 HTTP 方法并且僅on .get,.head并且.delete請求它對 URL 中傳遞的引數進行編碼。
鑒于這一事實,您永遠不會paramA在請求中看到(甚至在正文中也看不到),因為您在以下行中覆寫了它:
// here body is already serialized to Json
request.httpBody = Data(bodyInJsonString.utf8)
因此,您可以直接呼叫的初始化程式,而不是使用默認值 ,如下所示:URLEncodingURLEncodingdestination.queryString
// here I am specifying `paramA` value
request = try URLEncoding(destination: .queryString).encode(request, with: parameters)
// here body is already serialized to Json
request.httpBody = Data(bodyInJsonString.utf8)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
這樣,您將paramA在 URL 和 JSON 作為正文中收到請求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/426485.html
上一篇:如何使用nodejs和express使我的RESTAPI更快?
下一篇:如何發送這種Json回應
