发送请求时从数据库中删除 Swift Alamofire“+”号

Posted

技术标签:

【中文标题】发送请求时从数据库中删除 Swift Alamofire“+”号【英文标题】:Swift Alamofire "+" sign removed from DB when request was sent 【发布时间】:2021-02-11 02:42:35 【问题描述】:

我们遇到了这个奇怪的问题。一旦我们发送我们的请求,“+”就会在数据库中删除。

但如果我打印response.data,我可以看到“+”在那里(使用 Alamofire 4.9.1)

删除“+”的可能原因是什么?

以下是我设置请求和标头的方式:

【问题讨论】:

嗨,@Rob。我传递的字符串有“+”号,但由于某种原因,“+”在服务器上被“”替换。这只发生在请求来自应用程序时。它通过邮递员工作。我已经更新了我上面的代码问题,关于我如何设置它。 嗨,@Rob。我在上面添加了如何形成“requestString”。另外,我尝试将内容类型设置为“application/x-www-form-urlencoded”,但还是一样 嗨,@Rob。现在一切都好。我将在下面发布我的答案。感谢您的帮助! 完全不相关(希望您原谅我的观察),我是否从上面的屏幕快照中推断出您将密码存储在数据库中?在您的数据库中重复看到相同的值让我怀疑您没有对其进行加盐处理,无论是否加密,它都不是很安全。搜索“在数据库中存储密码的最佳方式”,特别是使用加盐的单向加密,例如codementor.io/php/tutorial/best-way-store-passwords-database. 【参考方案1】:

为了将来的读者,application/x-www-form-urlencoded 请求必须是“百分比编码”,将+ 字符替换为%2B。但实际上有很多字符可能需要编码,所以通常最好使用 Alamofire request 方法和 Parameters,它会为您处理所有这些细节。例如。在 Alamofire 4.9.1 中:

let headers: HTTPHeaders = [
    "Authorization": authorization
]

let parameters: Parameters = [
    "grant_type": "password",
    "username": username,
    "password": password
]

Alamofire.request(url, method: .post, parameters: parameters, headers: headers).responseJSON  response in
    switch response.result 
    case .failure(let error): print(error)
    case .success(let value): print(value)
    

或者在 Alamofire 5 及更高版本中,人们会使用 AF 而不是 Alamofire

AF.request(url, method: .post, parameters: parameters, headers: headers).responseJSON  response in
    switch response.result 
    case .failure(let error): print(error)
    case .success(let value): print(value)
    

查看Alamofire使用文档:POST Request With URL-Encoded Parameters


如果您真的想自己构建URLRequesthttpBody,而不是只对+ 字符进行百分比编码,您可以考虑更通用的百分比编码例程,如JSON request sending empty data 所示.这个想法和 Alamofire 的 Parameters 相同,即从字典中构建 httpBody

【讨论】:

【参考方案2】:

事实证明,“+”没有被正确转义。所以我不得不用“%2B”替换“+”

let requestString = "grant_type=password&username=" + encryptedTokenUsernameBody + "&password=" + encryptedTokenPasswordBody
     
let encodedString = requestString.replacingOccurrences(of: "+", with: "%2B")

【讨论】:

以上是关于发送请求时从数据库中删除 Swift Alamofire“+”号的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 构建设置 - 在生产构建时从 plist 中删除代码

在 Swift 中解析和存储 JSON

Django:在请求值时从查询集注释字段中删除小数前缀

请求失败时从 AlamoFire 获取 JSON 响应

显示警报时从窗口警报中删除警报文本

如何在 Swift 3 的 POST 请求中发送表单数据