通过 NSURLSession 发送表情符号时崩溃
Crash sending Emoji through an NSURLSession
我正在努力消除我的 Swift 项目之一中的一些烦人的错误。我想知道是否有一种方法可以通过 HTTP 传输表情符号,以便我的服务器端代码可以保存表情符号数据以供以后检索。问题是,在制定请求后,如果应用程序包含表情符号,则在创建 NSURL/NSURLSession(不确定到底是哪个)时应用程序会崩溃。
有什么方法可以让应用程序在插入表情符号时不崩溃,或者有没有专门的方法可以在 HTTP 请求中包含表情符号?
Alamofire.request(.POST, "removed/api.php?request=setBio&identification=" + identification + "&bio=" + content).responseJSON { response in
if let jsonStr = response.result.value {
let jsonObj = JSON(jsonStr)
print ("response for bio update: \(jsonObj["response"])")
self.user.bio = self.bioField.text!
}
}
如果 "content" 字符串包含表情符号,它将崩溃。 Alamofire 通过 NSUrlSession 运行一切。
Alamofire 中发生崩溃(显然它在展开可选值时发现 nil,不知道为什么。文本不是 nil。)
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URLString.URLString)!)
找到了一个非常简单的解决方案!
只需将其添加到内容变量中即可:
.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())!
您将能够发送带有表情符号的请求。
你应该让 Alamofire 对请求进行必要的转义:
let parameters = ["request": "setBio", "identification": identification, "bio": content]
Alamofire.request(.POST, "removed/api.php", parameters: parameters, encoding: .URLEncodedInURL)
.responseJSON { response in
if let jsonStr = response.result.value {
// ...
}
}
坦率地说,我在上面使用了 ParameterEncoding.URLEncodedInURL
,因为在您的原始示例中,您将这些参数放在了 URL 中。但是,通常对于 POST
请求,您会在请求正文中包含这些参数,这是通过省略 encoding
参数来完成的,或者,有点 confusingly/paradoxically,通过使用 [=13] =] 共 ParameterEncoding.URL
。将参数包含在请求正文中更习惯也更安全。但是,如果您 真的 必须在 URL 中包含这些参数,请为 encoding
提供 .URLEncodedInURL
值。
但关键信息是 Alamofire 已经知道如何正确地使用百分比转义参数,所以让它这样做,而不是自己手动构建 URL 或 NSURLRequest
。并且,作为警告,其他技术,例如 stringByAddingPercentEncodingWithAllowedCharacters
(具有 URLPathAllowedCharacterSet
等字符集)或 NSURLComponents
不仅不那么直接,而且它们也无法正确地转义某些字符请求(尽管他们会使用表情符号)。无论如何,最好让 Alamofire 处理这个问题,因为它可以正确转义百分比。
我正在努力消除我的 Swift 项目之一中的一些烦人的错误。我想知道是否有一种方法可以通过 HTTP 传输表情符号,以便我的服务器端代码可以保存表情符号数据以供以后检索。问题是,在制定请求后,如果应用程序包含表情符号,则在创建 NSURL/NSURLSession(不确定到底是哪个)时应用程序会崩溃。
有什么方法可以让应用程序在插入表情符号时不崩溃,或者有没有专门的方法可以在 HTTP 请求中包含表情符号?
Alamofire.request(.POST, "removed/api.php?request=setBio&identification=" + identification + "&bio=" + content).responseJSON { response in
if let jsonStr = response.result.value {
let jsonObj = JSON(jsonStr)
print ("response for bio update: \(jsonObj["response"])")
self.user.bio = self.bioField.text!
}
}
如果 "content" 字符串包含表情符号,它将崩溃。 Alamofire 通过 NSUrlSession 运行一切。
Alamofire 中发生崩溃(显然它在展开可选值时发现 nil,不知道为什么。文本不是 nil。)
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URLString.URLString)!)
找到了一个非常简单的解决方案!
只需将其添加到内容变量中即可:
.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())!
您将能够发送带有表情符号的请求。
你应该让 Alamofire 对请求进行必要的转义:
let parameters = ["request": "setBio", "identification": identification, "bio": content]
Alamofire.request(.POST, "removed/api.php", parameters: parameters, encoding: .URLEncodedInURL)
.responseJSON { response in
if let jsonStr = response.result.value {
// ...
}
}
坦率地说,我在上面使用了 ParameterEncoding.URLEncodedInURL
,因为在您的原始示例中,您将这些参数放在了 URL 中。但是,通常对于 POST
请求,您会在请求正文中包含这些参数,这是通过省略 encoding
参数来完成的,或者,有点 confusingly/paradoxically,通过使用 [=13] =] 共 ParameterEncoding.URL
。将参数包含在请求正文中更习惯也更安全。但是,如果您 真的 必须在 URL 中包含这些参数,请为 encoding
提供 .URLEncodedInURL
值。
但关键信息是 Alamofire 已经知道如何正确地使用百分比转义参数,所以让它这样做,而不是自己手动构建 URL 或 NSURLRequest
。并且,作为警告,其他技术,例如 stringByAddingPercentEncodingWithAllowedCharacters
(具有 URLPathAllowedCharacterSet
等字符集)或 NSURLComponents
不仅不那么直接,而且它们也无法正确地转义某些字符请求(尽管他们会使用表情符号)。无论如何,最好让 Alamofire 处理这个问题,因为它可以正确转义百分比。