在Alamofire POST方法中POST多个JSON对象 - Swift / IOS

7
对不起,如果我的问题不清楚,我会尝试用解释让自己更加清楚。这是我正在尝试做的事情,我正在尝试使用Alamofire发布多个评论(当用户编写新评论时,它将作为JSON对象实现并存储)。我将这些JSON注释传递给我的发布例程,在那里我可以使用SwiftyJSON提取每个值。现在的问题是,如果我想授权用户,则知道如何设置参数如下:
    var parameters = [
    "userName": userName,
    "password": passwordSalt,
    "somethingElse": somethingElse
    ]
    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(parameters , options: nil, error: &err)

到这里为止都很简单,现在我遇到了问题。我正在尝试使用Alamofire Post来发布多个JSON对象,它们应该是这样的:

[
   {
    "comment": "my First Comment",
    "commentDate": "2014-05-13 14:30 PM",
    "isSigned": 1,
    "patientId": 2,
    "documentId": 3
    },
   {
    "comment": "my SecondComment",
    "commentDate": "2014-05-14 14:30 PM",
    "isSigned": 2,
    "patientId": 3,
    "documentId": 4
    },
   {
    "comment": "my third Comment",
    "commentDate": "2014-05-15 14:30 PM",
    "isSigned": 3,
    "patientId": 4,
    "documentId": 5
    }
 ]

我如何通过迭代JSON对象来创建上述数组/ JSON(我不确定该怎么称呼它)?我知道如何从JSON对象中获取JSON值,我想知道如何创建像上面示例中那样的参数变量来保存数据。使用Alamofire是否可以做到这一点?(一次POST多个对象)
我尝试过几种方法,但都没有成功。
  1. var dictArray = [Dictionary<String, Any>]
    var dict = Dictionary<String, Any>
    

    While iterating over JSON object inserted each value in dict and appended dict to dictArray, now when I'm trying to use dictArray as parameters in .dataWithJSONObject it doesn't like the object.

  2. var dict = Dictionary<String, AnyObject>
    var array = NSArray()
    

    extracted each value by iterating over the JSON object and inserted them into dict and tried inserting dict into array. But this gives a different problem. The way it builds the objects is different from what is required, as follows.

    [
       {
        comment: my First Comment,
        commentDate: 2015-05-13 13:30 PM"",
        isSigned: 1,
        patientId: 2,
        documentId: 3 
       },
       {
        comment: my Second Comment,
        commentDate: 2015-05-13 13:30 PM"",
        isSigned: 2,
        patientId: 5,
        documentId: 4 
       },
       {
        comment: my third Comment,
        commentDate: 2015-06-13 13:30 PM"",
        isSigned: 5,
        patientId: 1,
        documentId: 9 
       }
    ]
    

    Here the Keys doesn't get wrapped inside quotes (Correct way: "comment", wrong way: comment).

有人尝试过发布多个对象吗?alamofire能够做到吗?希望我的问题表述清楚了。如果这个问题太简单了,请见谅,我花了一整天的时间来解决它,但是没有成功。

3个回答

5
您发布的评论对象数组在Swift中的正确表示方式如下:
    let comments: Array<[String:AnyObject]> = [
        [
            "comment": "my First Comment",
            "commentDate": "2014-05-13 14:30 PM",
            "isSigned": 1,
            "patientId": 2,
            "documentId": 3
        ],
        [
            "comment": "my SecondComment",
            "commentDate": "2014-05-14 14:30 PM",
            "isSigned": 2,
            "patientId": 3,
            "documentId": 4
        ],
        [
            "comment": "my third Comment",
            "commentDate": "2014-05-15 14:30 PM",
            "isSigned": 3,
            "patientId": 4,
            "documentId": 5
        ]
    ]

发送一个单独的评论相对来说很简单:
    let comment: [String:AnyObject] = [
        "comment": "my First Comment",
        "commentDate": "2014-05-13 14:30 PM",
        "isSigned": 1,
        "patientId": 2,
        "documentId": 3
    ]

    Alamofire.request(.POST, "http://httpbin.org/post", parameters: comment).responseJSON { (req, res, json, error) in
        println(req)
        println(res)
        println(json)
        println(error)
    }

然而,如果想要发送一组评论,似乎您需要自己生成URLRequest并按照以下方式将其传递给Alamofire:

    let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "http://httpbin.org/post")!)
    mutableURLRequest.HTTPMethod = "POST"
    var error: NSError? = nil

    let options = NSJSONWritingOptions.allZeros
    if let data = NSJSONSerialization.dataWithJSONObject(comments, options: options, error: &error) {
        mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
        mutableURLRequest.HTTPBody = data
    }

    Alamofire.request(mutableURLRequest).responseJSON { (req, res, json, error) in
        println(req)
        println(res)
        println(json)
        println(error)
    }

如果您可以修改API后端以接受具有多个评论的对象,那么您也可以通过这种方式发送它们:
    Alamofire.request(.POST, "http://httpbin.org/post", parameters: ["comments": comments]).responseJSON { (req, res, json, error) in
        println(req)
        println(res)
        println(json)
        println(error)
    }

敬礼。


我现在离开了我的系统,我会尽可能地处理这个问题并告诉你。谢谢你的时间@Eneko :) - Sashi

0

这样会更好

创建字典和字典变量的数组,然后循环发送数据源中需要发送的参数数量,可以是数组或其他形式。

以下是我的情况

需要回答所有问题(将是一个随机的数字/大小)

var ansParams = [[String: String]]()
var paramz = [String: String]()


for question in sectionQuestions{
    paramz = [
        AppConstants.PARAMETER.KEY_1    : "Value",
        AppConstants.PARAMETER.KEY_2    : "Value",
        AppConstants.PARAMETER.KEY_3    : "Value",
        AppConstants.PARAMETER.KEY_4    : "Value",
        AppConstants.PARAMETER.KEY_5    : "Value"
    ]
    ansParams.append(paramz)
}


print(ansParams)


//Check All Paramz and its values then send ansParams as Parameter to POST request

-2
在我的项目中,我遇到了类似的问题,当使用一个不允许一次性发布多个对象的API时。如上所述的数组格式是正确的。
   let comments: Array<[String:AnyObject]> = [
        [
            "comment": "my First Comment",
            "commentDate": "2014-05-13 14:30 PM",
            "isSigned": 1,
            "patientId": 2,
            "documentId": 3
        ],
        [
            "comment": "my SecondComment",
            "commentDate": "2014-05-14 14:30 PM",
            "isSigned": 2,
            "patientId": 3,
            "documentId": 4
        ],
        [
            "comment": "my third Comment",
            "commentDate": "2014-05-15 14:30 PM",
            "isSigned": 3,
            "patientId": 4,
            "documentId": 5
        ]
    ]

然后我使用了一个for循环来将数组中的每个对象发布到API。
    var index = comments.count
    var i = 0

    for i = 0; i < index; i++ {

        let urlString = "\(.baseURL)...etc"

        let parameters = comments[i]

        Alamofire.request(.POST, urlString, parameters: parameters)

            .responseJSON { (req, res, data, error) -> Void in

//                    println(req)
//                    println(res)
//                    println(data)
//                    println(error)

                println("\(i) of \(index) posted")
        }
    }

如果API允许,那么可以采用更高效的方法,但如果没有其他选择,这种方式也非常好用。


@DataYeah -- 什么是低效的?你有更好的方法吗? - hegranes
1
你每个评论都发起了一次HTTP请求。将所有评论放在一个请求中发送会更加高效。 - dy_
我正在使用的API不允许这样做,因此我采用了“低效”的解决方法。不过你说得对,我应该澄清我的回答。 - hegranes
你的 API 在连续 4 次请求没有延迟的情况下不会超时吗? - Tim Nuwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接