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 многостранна заявка“, за да можете да видите как са данните предавани.

Накратко и дълго е, че 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}]} в AFNetworking constructingBodyWithBlock, е правилен, нали? От страната на сървъра използвам Django Rest Framework 3.0. Всъщност съм нов и за двете страни, така че ми трябва известно време, за да го разбера. - person redstone; 23.12.2014