URLRequest 编码不捕获特殊字符

URLRequest encoding not catching special characters

我正在使用下面的代码生成 URLRequest,但特殊字符(如 &)没有被正确编码。我做错了什么?

  var request = URLRequest(url: URL(string: "http://\(hostToUse)/user/login")!)
    request.httpMethod = "POST"
    request.timeoutInterval = 120.0
    var postString = "data={\"userName\":\"\(username)\",\"password\":\"\(password)\"}"
    postString = postString.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
    postString = postString.replacingOccurrences(of: " ", with: "")
    request.httpBody = postString.data(using: .utf8, allowLossyConversion: false)
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

& 是一个特殊字符,你可以

let newString = aString.replacingOccurrences(of: "&", with: "%20")

这段代码可能存在一些问题:

  • 您正在单个 URL-encoded 表单字段中上传 JSON 数据块,并且没有使用任何其他字段。为什么不直接将上传格式设置为 JSON 并完全放弃 URL 编码?
  • 你试图 URL-encode 整个 "fieldname=value" 而你应该 URL-encoding 价值部分。
  • 字母数字字符集太宽泛了,包括任何看起来像数字的字符。 URL 的合法字符集比那个小得多。

顺便说一句,我相当确定即使 URLQueryAllowedCharacterSet 对于单个查询字符串字段来说也太宽泛了,因为它允许像等号和&符号这样的字符在查询的正常使用中保留为字段分隔符字符串。

为了最大程度的安全,您应该改用自己的字符集,其中 未保留的字符:

    [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuv"
        "wxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"]

或者更好的是,使用 NSURLComponents。它具有专门用于构造查询字符串的属性。