代码之家  ›  专栏  ›  技术社区  ›  user1079052

URLRequest编码未捕获特殊字符

  •  0
  • user1079052  · 技术社区  · 6 年前

    我使用下面的代码发出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 回复  |  直到 6 年前
        1
  •  0
  •   dgatwood    6 年前

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

    • 您将在一个URL编码的表单字段中上载一个JSON数据块,而不使用任何其他字段。为什么不直接将上传格式设置为JSON并完全放弃URL编码?
    • 您正在尝试对整个“fieldname=value”进行URL编码,而您应该只对值部分进行URL编码。
    • 字母数字字符集太宽了,包括任何看起来像数字的字符。URL的法定字符集要小得多。

    顺便说一句,我很确定 URLQueryAllowedCharacterSet 对于单个查询字符串字段来说太宽,因为它允许在正常使用查询字符串时保留为字段分隔符的等号和符号等字符。

    为了最大程度的安全,您应该使用自己的字符集,该字符集包含 只有 无保留字符:

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

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

        2
  •  0
  •   Shehata Gamal    6 年前

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

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