字符串中带有双引号的Alamofire请求参数

时间:2019-09-18 11:29:51

标签: swift encoding alamofire

我正面临一个有线方案,即我在请求中使用双引号传递参数。

使用JSONEncoding.default

一样自动使用\用双引号对字符串进行转义

"Test "hello "将是"Test \" hello "

但是反手要我发送"Test \\\" hello "(带双引号的三斜杠)

是否可以使用ParameterEncoding来实现此目的,还是需要手动替换参数中的每个字符串?我有大量带有数百个参数组合的请求。

我没有添加任何代码,因为它是简单的alamofire请求。不过,如果您需要查看它,我将使用alamofire请求代码来更新我的问题。

1 个答案:

答案 0 :(得分:1)

否,无法以这种方式自定义JSON编码,因为这是JSONSerializationJSONEncoder的局限。如果确实需要这样做,我建议您创建自己的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的转换,效率相当低,但是对于较小的有效负载来说应该不会太糟糕。