使用 NSURLSession 将带有与号 (&) 的字符串从 iOS 传递到 PHP/MySQL


Pass string with ampersand (&) from iOS to PHP/MySQL with NSURLSession

我正在通过 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/。