AFNetworking 2.0 отправляет параметры и изображение на сервер

Я использую 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)")
    })


На стороне сервера данные будут dictionary объединены parameters(QueryDict) и изображением data(MultiValueDict):

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': [<InMemoryUploadedFile: file.jpg (image/jpeg)>]}]}

Формат данных — словарь со значением массива, а массив имеет другое значение словаря.

Итак, что я могу сделать, чтобы formData.appendPartWithFileData стал таким форматом данных выше?


ИЗМЕНИТЬ:

Я видел несколько сообщений, похожих на мой вопрос. Например, это: изображение поста AFNetworking во вложенном json

Я попытался изменить свой код следующим образом:

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

or

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)>
    }]
} 

Есть идеи?


person redstone    schedule 22.12.2014    source источник


Ответы (1)


Когда вы отправляете составной HTTP-запрос, данные JSON и данные изображения разделены — буквально несколько частей. Возможно, стоит взглянуть на этот ответ на вопрос "Что такое HTTP Multipart Request", чтобы вы могли видеть, как данные передано.

Суть в том, что JSON и изображение объединяются в словарь на стороне сервера. Изображение не передается встроенным в JSON. Семантика того, как они объединяются (например, как такое имя, как groupImages[0][image], используется для слияния со словарем JSON), определяется сервером, а не вашим приложением для iOS.

Таким образом, ваша команда сервера должна иметь возможность указать, как вы называете этот файл, чтобы он правильно объединялся со словарем. Они должны быть в состоянии создать образец HTTP-запроса, который работает правильно (например, используя curl или Postman). Если на вашем сервере есть веб-приложение, вы можете проверить аналогичную функцию в веб-приложении, чтобы увидеть, как там выглядит запрос. Получив рабочий запрос, вы можете сымитировать его, сравнив исходящий NSURLRequest с образцом запроса, который они предоставляют.

person Aaron Brager    schedule 23.12.2014
comment
Спасибо за ваш ответ Аарон. Во-первых, я просто хотел убедиться, что этот формат 'groupImages[0][image]', представляющий вложенный JSON {'groupImages': [{'image': #imageData}]} в конструкции AFNetworkingBodyWithBlock, является правильным, верно? На стороне сервера я использую Django Rest Framework 3.0. На самом деле я новичок в обеих сторонах, поэтому мне нужно время, чтобы выяснить это. - person redstone; 23.12.2014