alamofire 准备不正确 url
alamofire is not preparing correct url
我正在使用 alamofire 调用网络服务。
request(url, method: webMethod, parameters: webParams, encoding: URLEncoding.default, headers: headers)
.validate(statusCode: 200..<300)
.responseJSON { (response) in
print("responseresponse===\(response.request)")
我的成绩低于记录。
responseresponse===http://www.mywebsite.com/api/searchFlight?
adults=3&charter=true&directFlight=true&
flexibleDays=0&flightClass=PREMIUM_ECONOMY&
offerLimit=10&refundableOnly=false&
routes%5B%5D=KWI-BOM%2C2018-08-09&routes%5B%5D=BOM-KWI%2C2018-08-25
我传递的参数如下 & 它们的类型是 [String: Any]
[
"adults": 3,
"directFlight": "true",
"flightClass": "PREMIUM_ECONOMY",
"refundableOnly": "false",
"offerLimit": 10,
"flexibleDays": "0",
"charter": "true",
"routes": ["KWI-BOM,2018-08-09", "BOM-KWI,2018-08-25"]
]
这个 return 我的状态码为 400,表示请求无效。
我不明白为什么路由输出错误?路线如下
routes%5B%5D=KWI-BOM%2C2018-08-09&routes%5B%5D=BOM-KWI%2C2018-08-25
^^^^^^ ^^^^^^
我原以为路线如下。
routes=KWI-BOM%2C2018-08-09&routes=BOM-KWI%2C2018-08-25
我知道我错过了什么吗?
我假设 webmethod 等于 .post 并尝试更改编码:JSONEncoding.default,在这种情况下,请求不会通过 url 发送数据,而是从body 数据。那是因为复杂的数据不能通过url发送。还要尝试验证您的 end-point 收到具有相同 属性 名称的 object 并且类型匹配。我已经用 Alamofire 执行了几个 post 请求,它们按预期工作。
%5B%5D
是 UrlQueryAllowed 编码 []
。那是 Alamofire 再次引人注目 - 它看到 routes
参数是一个字典,所以它传递 routes[]=foo&routes[]=bar
而不是 routes=foo&routes=bar
并且你的后端抱怨错误参数(routes
是强制性的?)。不太清楚为什么 Alamofire 会这样做,如果 HTTP 需要一个数组参数在其键的末尾有 []
- 永远不必将数组作为查询参数传递。我只是尝试手动编码 routes
并使用一些定界符传递 routes: <String>
。
或者更改我的后端以期望 routes[]
而不是 routes
。这似乎更容易修复。
下面是我做的
斯威夫特3
移除 GET 请求的方括号
struct CustomGetEncoding: ParameterEncoding {
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try URLEncoding().encode(urlRequest, with: parameters)
request.url = URL(string: request.url!.absoluteString.replacingOccurrences(of: "%5B%5D=", with: "="))
return request
}
}
...
Alamofire.request("http://example.com", method: .get, parameters: ["foo": ["bar1", "bar2"]], encoding: CustomGetEncoding())
移除 POST 请求的方括号
struct CustomPostEncoding: ParameterEncoding {
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try URLEncoding().encode(urlRequest, with: parameters)
let httpBody = NSString(data: request.httpBody!, encoding: String.Encoding.utf8.rawValue)!
request.httpBody = httpBody.replacingOccurrences(of: "%5B%5D=", with: "=").data(using: .utf8)
return request
}
}
...
Alamofire.request("http://example.com", method: .post, parameters: ["foo": ["bar1", "bar2"]], encoding: CustomPostEncoding())
斯威夫特2
移除 GET 请求的方括号
let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
mutableRequest.URL = NSURL(string: mutableRequest.URLString.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "="))
return (mutableRequest, error)
}
Alamofire.request(.GET, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)
移除 POST 请求的方括号
let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
let httpBody = NSString(data: mutableRequest.HTTPBody!, encoding: NSUTF8StringEncoding)!
mutableRequest.HTTPBody = httpBody.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "=").dataUsingEncoding(NSUTF8StringEncoding)
return (mutableRequest, error)
}
Alamofire.request(.POST, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)
Reference
我正在使用 alamofire 调用网络服务。
request(url, method: webMethod, parameters: webParams, encoding: URLEncoding.default, headers: headers)
.validate(statusCode: 200..<300)
.responseJSON { (response) in
print("responseresponse===\(response.request)")
我的成绩低于记录。
responseresponse===http://www.mywebsite.com/api/searchFlight?
adults=3&charter=true&directFlight=true&
flexibleDays=0&flightClass=PREMIUM_ECONOMY&
offerLimit=10&refundableOnly=false&
routes%5B%5D=KWI-BOM%2C2018-08-09&routes%5B%5D=BOM-KWI%2C2018-08-25
我传递的参数如下 & 它们的类型是 [String: Any]
[
"adults": 3,
"directFlight": "true",
"flightClass": "PREMIUM_ECONOMY",
"refundableOnly": "false",
"offerLimit": 10,
"flexibleDays": "0",
"charter": "true",
"routes": ["KWI-BOM,2018-08-09", "BOM-KWI,2018-08-25"]
]
这个 return 我的状态码为 400,表示请求无效。
我不明白为什么路由输出错误?路线如下
routes%5B%5D=KWI-BOM%2C2018-08-09&routes%5B%5D=BOM-KWI%2C2018-08-25
^^^^^^ ^^^^^^
我原以为路线如下。
routes=KWI-BOM%2C2018-08-09&routes=BOM-KWI%2C2018-08-25
我知道我错过了什么吗?
我假设 webmethod 等于 .post 并尝试更改编码:JSONEncoding.default,在这种情况下,请求不会通过 url 发送数据,而是从body 数据。那是因为复杂的数据不能通过url发送。还要尝试验证您的 end-point 收到具有相同 属性 名称的 object 并且类型匹配。我已经用 Alamofire 执行了几个 post 请求,它们按预期工作。
%5B%5D
是 UrlQueryAllowed 编码 []
。那是 Alamofire 再次引人注目 - 它看到 routes
参数是一个字典,所以它传递 routes[]=foo&routes[]=bar
而不是 routes=foo&routes=bar
并且你的后端抱怨错误参数(routes
是强制性的?)。不太清楚为什么 Alamofire 会这样做,如果 HTTP 需要一个数组参数在其键的末尾有 []
- 永远不必将数组作为查询参数传递。我只是尝试手动编码 routes
并使用一些定界符传递 routes: <String>
。
或者更改我的后端以期望 routes[]
而不是 routes
。这似乎更容易修复。
下面是我做的
斯威夫特3
移除 GET 请求的方括号
struct CustomGetEncoding: ParameterEncoding {
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try URLEncoding().encode(urlRequest, with: parameters)
request.url = URL(string: request.url!.absoluteString.replacingOccurrences(of: "%5B%5D=", with: "="))
return request
}
}
...
Alamofire.request("http://example.com", method: .get, parameters: ["foo": ["bar1", "bar2"]], encoding: CustomGetEncoding())
移除 POST 请求的方括号
struct CustomPostEncoding: ParameterEncoding {
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try URLEncoding().encode(urlRequest, with: parameters)
let httpBody = NSString(data: request.httpBody!, encoding: String.Encoding.utf8.rawValue)!
request.httpBody = httpBody.replacingOccurrences(of: "%5B%5D=", with: "=").data(using: .utf8)
return request
}
}
...
Alamofire.request("http://example.com", method: .post, parameters: ["foo": ["bar1", "bar2"]], encoding: CustomPostEncoding())
斯威夫特2
移除 GET 请求的方括号
let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
mutableRequest.URL = NSURL(string: mutableRequest.URLString.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "="))
return (mutableRequest, error)
}
Alamofire.request(.GET, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)
移除 POST 请求的方括号
let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
let httpBody = NSString(data: mutableRequest.HTTPBody!, encoding: NSUTF8StringEncoding)!
mutableRequest.HTTPBody = httpBody.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "=").dataUsingEncoding(NSUTF8StringEncoding)
return (mutableRequest, error)
}
Alamofire.request(.POST, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)