-1

我面临着有线场景,我在请求中使用双引号传递参数。

使用JSONEncoding.defaultAlamofire 自动转义带有双引号的字符串和\ like

"Test "hello " 将会"Test \" hello "

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

有什么方法可以使用ParameterEncoding或者我需要手动替换参数中的每个字符串吗?我有许多请求组合了数百个参数。

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

4

1 回答 1

1

不,无法以这种方式自定义 JSON 编码,因为这是JSONSerializationand的限制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,但对于小型有效负载来说应该不会太糟糕。

于 2019-09-19T03:23:25.357 回答