URLRequest编码未捕获特殊字符

时间:2018-02-16 15:13:36

标签: ios swift encoding nsurlrequest

我使用下面的代码制作一个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")

2 个答案:

答案 0 :(得分:0)

&安培;是一个特殊的角色,你可以

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

答案 1 :(得分:0)

此代码存在许多可能的问题:

  • 您在一个URL编码的表单字段中上传了一小撮JSON数据,而不是使用任何其他字段。为什么不将上传格式设为JSON并完全抛弃URL编码?
  • 当您只是对值部分进行URL编码时,您正尝试对整个“fieldname = value”进行URL编码。
  • 字母数字字符集过于宽泛,包括任何看起来像数字的东西。 URL的合法字符集远小于此。
顺便说一下,我很确定即使URLQueryAllowedCharacterSet对于单个查询字符串字段来说太宽泛,因为它允许在正常使用查询字符串时保留为字段分隔符的等号和符号等字符。

为了最大限度地提高安全性,您应该使用自己的包含 无保留字符的字符集:

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

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