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

时间:2015-04-28 04:10:00

标签: ios json swift alamofire

很抱歉,如果我的问题不明确,我会尽力说清楚。所以这正是我试图做的事情,我试图使用Alamofire发布多个评论(我的应用程序实现的东西,并且每当用户编写新评论时都将存储为JSON对象) 。我将这些JSON注释传递给我的post例程,在那里我可以使用SwiftyJSON来提取每个值。不知道如果我试图按如下方式授权用户,我知道如何设置参数

    var parameters = [
    "userName": userName,
    "password": passwordSalt,
    "somethingElse": somethingElse
    ]
    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(parameters , options: nil, error: &err)
直到这里,它非常简单,现在是我的问题。我试图使用alamofire帖子发布多个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>
    

    迭代JSON对象时,在 dict 中插入每个值,并将 dict 附加到 dictArray ,现在当我尝试使用时dictArray作为.dataWithJSONObject中的参数,它不喜欢该对象。

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

    通过迭代JSON对象并将它们插入 dict 并尝试将 dict 插入到数组中来提取每个值。但这给出了一个不同的问题。它构建对象的方式与所需的不同,如下所示。

    [
       {
        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 
       }
    ]
    

    此处并未包含在引号内(正确方式:&#34;评论&#34;,错误方式:评论)。

  3. 是否有人试图发布多个对象,alamofire是否能够这样做?我希望我明白这个问题。对不起,如果这个问题太简单了,我花了一整天的时间来解决这个问题,但没有成功。

3 个答案:

答案 0 :(得分: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)
    }

问候。

答案 1 :(得分:0)

这样会更好

创建字典和字典数组var 然后循环需要从数组或其他任何数据源发送多少个参数。

这是我的情况

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

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 :(得分:-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允许的话,效率会更高,但是这个流程效果很好。