我正面临一个有线方案,即我在请求中使用双引号传递参数。
使用JSONEncoding.default
像
\
用双引号对字符串进行转义
"Test "hello "
将是"Test \" hello "
但是反手要我发送"Test \\\" hello "
(带双引号的三斜杠)
是否可以使用ParameterEncoding
来实现此目的,还是需要手动替换参数中的每个字符串?我有大量带有数百个参数组合的请求。
我没有添加任何代码,因为它是简单的alamofire请求。不过,如果您需要查看它,我将使用alamofire请求代码来更新我的问题。
答案 0 :(得分:1)
否,无法以这种方式自定义JSON编码,因为这是JSONSerialization
和JSONEncoder
的局限。如果确实需要这样做,我建议您创建自己的ParameterEncoding
来处理所有编码参数的转义。
final class EscapingJSONEncoder: ParameterEncoding {
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var urlRequest = try urlRequest.asURLRequest()
guard let parameters = parameters else { return urlRequest }
do {
let data = try JSONSerialization.data(withJSONObject: parameters, options: [])
if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
urlRequest.httpBody = data
urlRequest.httpBody = urlRequest.httpBody.map { data in
var string = String(decoding: data, as: UTF8.self)
string = string.replacingOccurrences(of: #"\""#, with: #"\\\""#)
return Data(string.utf8)
}
} catch {
throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
}
return urlRequest
}
}
由于Data
-> String
-> Data
的转换,效率相当低,但是对于较小的有效负载来说应该不会太糟糕。