使用边界HTTP发布多个数据

时间:2014-12-05 12:35:23

标签: ios swift http-post nsurlsession

在我的iOS应用程序中,我试图将数据发布到具有HTTP Post请求的服务器。我使用以下方法来创建请求正文;

func createBodyWithParameters(filePathKey: String?, boundary: String) -> NSData {
    let body = NSMutableData()
    let filename = String(format: "%lld.jpg", NSDate().timeIntervalSince1970 * 1000)
    let data = UIImageJPEGRepresentation(self.photoTaken , 0.6)
    println(data.length)
    let mimetype = "image/png"

    body.appendString("--\(boundary)\r\n")
    body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
    //body.appendString("Category: \(self.categoryAbbreviations[self.tag])\r\n")
    body.appendString("Content-Type: \(mimetype)\r\n\r\n")
    body.appendData(data!)
    body.appendString("\r\n")

    body.appendString("--\(boundary)--\r\n")
    body.appendString("Category: \(self.categoryAbbreviations[self.tag])\r\n")
    body.appendString("--\(boundary)--\r\n")
    return body
}

我将类别信息和图像数据与边界分开。但是,服务器使用HTTP错误400(错误请求)对此进行响应。如果我尝试将类别信息和图像数据一起发送,我收到HTTP错误413(请求实体太大)

我认为问题在于我创建了我的请求体错了。请求数据有问题吗?

1 个答案:

答案 0 :(得分:1)

两个问题

  1. 你太快终止了身体。 --boundary--语法用于正文的末尾。

  2. 您未对Category值进行正确编码。

  3. 所以,它应该看起来像:

    // add category
    
    body.appendString("--\(boundary)\r\n")
    body.appendString("Content-Disposition: form-data; name=\"Category\"\r\n\r\n")
    body.appendString("\(self.categoryAbbreviations[self.tag])\r\n")
    
    // now all done 
    
    body.appendString("--\(boundary)--\r\n")
    

    坦率地说,人们可能会考虑使用AFNetworking来创建这些多部分请求,因为它简化了流程。


    参考文献: