我正在通过 POST 将一大组字符串从 iOS (Swift) 传递到我的服务器到 PHP 文件。 不幸的是,如果用户在字段中放置了与号 (&),则该字段的其余部分将丢失。我明白为什么(并表示消息中的下一个字段),但我不确定如何解决。
func UploadToSql(plan: LessonPlan, isNew: Bool, callBack: ((data: NSData!, response: NSURLResponse!, error: NSError!) -> Void)?) {
let url = NSURL(string: "https://myserver.com/receive.php")!
var request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
var bodyData = "Author='(plan.author)&title='(plan.title)&grade='(plan.grade)&date='"'(plan.date)'"&element1='(plan.element1)&objective1='(convertedFields[0])&element2='(plan.element2)&objective2='(convertedFields[1])&element3='(plan.element3)&objective3='(convertedFields[2])&coreProcess1='(plan.coreProcess1)&coreStrand1='(plan.coreStrand1)&coreStandard1='(plan.coreStandard1)&coreProcess2='(plan.coreProcess2)&coreStrand2='(plan.coreStrand2)&coreStandard2='(plan.coreStandard2)&coreProcess3='(plan.coreProcess3)&coreStrand3='(plan.coreStrand3)&coreStandard3='(plan.coreStandard3)&media1='(plan.media1)&media2='(plan.media2)&media3='(plan.media3)&media4='(plan.media4)&media5='(plan.media5)&media6='(plan.media6)&repertoire1='(convertedFields[3])&repertoire2='(convertedFields[4])&repertoire3='(convertedFields[5])&process='(convertedFields[6])&assessment='(convertedFields[7])&stateCat1='(plan.stateCat1)&stateCat2='(plan.stateCat2)&stateCat3='(plan.stateCat3)&stateStand1='(plan.stateStand1)&stateStand2='(plan.stateStand2)&stateStand3='(plan.stateStand3)&comment='(plan.comment)&shared='(sharedInt!)&authorName='(plan.authorName)" + planID
request.HTTPMethod = "POST"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error='(error)")
return
}
println("response = '(response)")
callBack?(data: data, response: response, error: error)
return
}
task.resume()
}
通常对于这样的 webrequest,它使用 % 后跟 ascii 十六进制值。&的十六进制值为 26,因此为 %26
google.com/#q=red%26white 是谷歌搜索Red&White的例子,它使用该替代品
它被称为URL编码或百分比编码,这是另一个问题,其中包含有关如何进行更广泛的URL编码的答案:stackoverflow.com/questions/24551816/swift-encode-url
请注意,您必须将插入的每个元素 URL 编码到字符串中,而不是整个结果字符串中,因为您希望保留 & 的单独参数。
这个对我有用。我也在NSURLSession中使用PHP/MySQL。
func stringByAddingPercentEncodingForFormData(plusForSpace: Bool=false) -> String? {
let unreserved = "*-._"
let allowed = NSMutableCharacterSet.alphanumericCharacterSet()
allowed.addCharactersInString(unreserved)
if plusForSpace {
allowed.addCharactersInString(" ")
}
var encoded = stringByAddingPercentEncodingWithAllowedCharacters(allowed)
if plusForSpace {
encoded = encoded?.stringByReplacingOccurrencesOfString(" ",
withString: "+")
}
return encoded
}
从此链接找到上面的功能:http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/。