2015-06-10 37 views
2

我通过POST将大量字符串传递给从iOS(Swift)到我的服务器的PHP文件。不幸的是,如果用户在字段中放置&符号(&),则该字段的其余部分将丢失。我明白为什么(&表示邮件中的下一个字段),但我不知道如何解决。从iOS到PHP/MySQL传递带&符号(&)的字符串与NSURLSession

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() 
} 
+0

逃离你的特殊字符,然后当你需要再次显示他们的时候避开它们 –

+0

@我明白了,但怎么做? \并不适用于Swift。 – Tim

+0

通常对于这样的网络请求,它使用%后跟ascii十六进制值。 &为26的十六进制值,所以它会是%26 https://www.google.com/#q=red%26white谷歌搜索红色和白色的示例,它使用替换 –

回答

1

通常对于这样的网络请求,它使用%,接着是ascii十六进制值。为&的十六进制值是26,所以这将是%26

google.com/#q=red%26white是例如谷歌搜索红&白色,它使用替代

其所谓的URL编码或编码百分比,这里是另外一个问题就如何做更广泛的URL编码的答案:stackoverflow.com/questions/24551816/swift-encode-url

注意,你要保持你的&的,你将不得不URL编码你插成字符串,而不是整个结果字符串中的每个元素,单独的参数。

+0

这是解决方案,正如Will所说,我必须对每个元素进行编码,而不是完整的字符串。此外,PHP/MySQL进程处理%26并自动将其转换为&符号,因此我无需在重新下载时添加解码步骤。 – Tim

0

这一个正在为我工​​作。我也用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/