【问题标题】:AFNetworking 2.0 sends parameters and image to serverAFNetworking 2.0 向服务器发送参数和图像
【发布时间】:2015-02-20 04:27:21
【问题描述】:

我正在使用AFNetworking2向服务器发送参数和图像。

    manager.POST(urlPath, parameters: parameters, constructingBodyWithBlock: { (formData: AFMultipartFormData!) -> Void in
            formData.appendPartWithFileData(imageData!, name: "image", fileName: "dummy.jpg", mimeType: "image/jpeg")
        }, success: { (dataTask: NSURLSessionDataTask!, responseObject: AnyObject!) -> Void in
            println("success: \(responseObject.description)")

        }, failure: { (dataTask: NSURLSessionDataTask!, error: NSError!) -> Void in
            println("failure: \(error)")
    })


在服务器端,数据将是由parameters(QueryDict) 和图像data(MultiValueDict) 合并的dictionary

data=MergeDict(<QueryDict: {u'owner': [u'6'], u'description': [u'this
is p1'], u'name': [u'p1']}>, <MultiValueDict: {u'image':
[<InMemoryUploadedFile: file.jpg (image/jpeg)>]}>)


我认为“MultiValueDict”来自这部分代码:
formData.appendPartWithFileData(imageData!, name: "image", fileName: "dummy.jpg", mimeType: "image/jpeg")

但是,我希望 MultiValueDict 像这样: {u'groupImages': [{u'image': [&lt;InMemoryUploadedFile: file.jpg (image/jpeg)&gt;]}]}

数据格式是一个带有数组值的Dictionary,该数组还有另一个Dictionary值。

那么我该怎么做才能让formData.appendPartWithFileData变成这样的上述数据格式呢?


编辑:

我看过一些与我的问题类似的帖子。 比如这个:AFNetworking post image in nested json

我试图像这样更改我的代码:

formData.appendPartWithFileData(imageData!, name: "groupImages[0].image", fileName: "dummy.jpg", mimeType: "image/jpeg")

formData.appendPartWithFileData(imageData!, name: "groupImages[0][image]", fileName: "dummy.jpg", mimeType: "image/jpeg")

但没有一个对我有用。

我的服务器希望收到这样的 JSON:

{
    "name": "p2",
    "owner": 6,
    "description": "this is p2",
    "groupImages": [{
        "image": <InMemoryUploadedFile: dummy.jpg (image/jpeg)>
    }]
} 

有什么想法吗?

【问题讨论】:

    标签: ios swift afnetworking-2


    【解决方案1】:

    当您发送 multipart HTTP 请求时,JSON 数据和图像数据是分开的——字面意思是 multipart。可能值得看看this answer to "What is HTTP Multipart Request",这样您就可以了解数据是如何传输的。

    总而言之,就是在服务端把JSON和图片合并成一个字典。图像不会嵌入在 JSON 中传输。 如何它们合并的语义(例如,如何使用 groupImages[0][image] 之类的名称与 JSON 字典合并)由服务器确定,而不是由您的 iOS 应用程序确定。

    因此,您的服务器团队应该能够指定您如何命名此文件,以便正确地与字典合并。他们应该能够生成一个正常工作的示例 HTTP 请求(例如,使用 curl 或 Postman)。如果您的服务器有一个 Web 应用程序,您可以检查 Web 应用程序中的类似功能,以查看那里的请求是什么样的。一旦你有一个工作请求,你可以通过比较你传出的 NSURLRequest 和他们提供的示例请求来模仿它。

    【讨论】:

    • 感谢您的回答亚伦。首先,我只是想确保在 AFNetworking 构造BodyWithBlock 中表示嵌套 JSON {'groupImages': [{'image': #imageData}]} 的这种格式 'groupImages[0][image]' 是正确的,对吧?在服务器端,我使用的是 Django Rest Framework 3.0。我实际上是双方的新手,所以我需要一些时间来了解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多