【问题标题】:Post array of objects with Alamofire and SwiftyJSON使用 Alamofire 和 SwiftyJSON 发布对象数组
【发布时间】:2018-10-06 17:28:16
【问题描述】:

我有一系列字典,我试图在 SwiftyJSON 的帮助下将它们发布到 Alamofire。

api设置为:

[
    {
        "imageUrl": "someimage3.jpg"
    },
    {
        "imageUrl": "someimage4.jpg"
    }
]

打印出来的带有图像对象的数组看起来像这样,带有 imageUrl 键和值的图像名称。

uploadedFiles = [
    [imageUrl: "someimage.jpg"],
    [imageUrl: "someimage2.jpg"]
]

我正在尝试将字典数组转换为正文所需的格式。我不太确定如何让它们成为 [String: AnyObject]

var body: [String: AnyObject] = [:]
let paramsJSON = JSON(uploadedFiles)
body = paramsJSON

alamofire 帖子

Alamofire.request("\(BASE_URL)mainimages/\(someid)", method: .post, parameters: body, encoding: JSONEncoding.default, headers: header).responseString { (response) in
        if response.result.error == nil {
            let status = response.response?.statusCode
            completion(true, status)
        } else {
            completion(false, nil)
            debugPrint(response.result.error as Any)
        }
    }

【问题讨论】:

  • API 接受一个数组,所以给它一个。
  • 在uploadFiles字典中键名应该是String类型
  • 在你设置 Alamofire 请求正文的位置显示你的代码。(即参数)
  • 刚刚更新了发帖请求,谢谢。
  • 请澄清:“图像对象”实际上是指 URL?你也想上传图片吗? (如果是,我会推荐一个多部分请求)

标签: swift alamofire swift4 swifty-json


【解决方案1】:

你可以用这个方法实现,它对我有用。

let payload = [["eventName": "Notifications","body":["version": "1.0","latitude": lat,"longitude":lon]]] as [[String : AnyObject]]

trackEventRequest(requestParams: payload, urlString: "https://xyz/youyURL")





func trackEventRequest(requestParams: [[String: AnyObject]], urlString: String) {

        let url = URL(string: urlString)
        var request = URLRequest(url: url!)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "POST"
        request.httpBody = try! JSONSerialization.data(withJSONObject: requestParams, options: [])

        Alamofire.request(reqeust).responseJSON { (response) in
            switch response.result {
            case .success:
                print(response.result.value)
                break
            case .failure:
                print(response.error)
                break
            }
        }
    }

【讨论】:

    【解决方案2】:

    我按照 Mani 的建议重新格式化了我的 API,以便更轻松地为 Alamofire 提供所需的内容。它现在正在寻找这个:

    {
        "allImages" : [
            {
                "imageUrl": "someimage5.jpg"
            },
            {
                "imageUrl": "someimage6.jpg"
            }
        ]
    }
    

    我还必须像下面的代码一样重新格式化我的数组,以消除 JSON 错误。

    var newUploadFilesArray = [AnyObject]()
        for item in uploadedFiles {
            let singleImageDict = ["imageUrl" : item.imageUrl]
            newUploadFilesArray.append(singleImageDict as AnyObject)
        }
    
        let body: [String: AnyObject] = [
            "allImages": newUploadFilesArray as AnyObject
        ]
    
        Alamofire.request("\(BASE_URL)mainimages/\(mainId)", method: .post, parameters: body, encoding: JSONEncoding.default, headers: header).responseString { (response) in
            if response.result.error == nil {
                let status = response.response?.statusCode
                completion(true, status)
            } else {
                completion(false, nil)
                debugPrint(response.result.error as Any)
            }
        }
    

    【讨论】:

      【解决方案3】:

      API 似乎采用具有数组作为顶层的 JSON,而不是字典,因此将数组转换为字典是不正确的。

      只需传入一个数组!

      SwiftyJSON 的 JSON 符合 ExpressibleByArrayLiteral,所以你可以只使用数组字面量:

      let paramsJSON: JSON = [
          ["imageUrl": "someimage.jpg"],
          ["imageUrl": "someimage2.jpg"]
      ]
      

      编辑:我刚刚意识到 Alamofire 的 request 方法只接受 [String: AnyObject]。这意味着你需要自己做参数编码,演示here

      或者,创建您自己的URLRequest,如post 所示:

      var request = URLRequest(url: someURL)
      request.httpMethod = "POST"
      request.setValue("application/json", forHTTPHeaderField: "Content-Type")
      request.httpBody = paramsJSON.rawData()
      Alamofire.request(request)
      

      【讨论】:

      • 对不起,我可能不太清楚,我不是想把它转换成字典,这就是我现在所拥有的。把它变成我可以传递给 alamofire 的东西。我试过你的数组并得到错误“调用中的额外参数'方法'”
      • 这确实解决了无法使用 Alamofire 上传我的数组的问题。我仍然无法将我的字典数组转换为正确的 JSON 格式。让 paramsJSON: JSON = JSON(uploadedFiles) 给我未知数。打印出来的上传文件如下所示: [MyApp.NoteImage(imageUrl: "someimage.png"), MyApp.NoteImage(imageUrl: "someimage2.png")]
      【解决方案4】:

      您可以通过构建手动请求并调用Alamofire.request 来完成此操作,如下所示

      var request = URLRequest(url: .......))
      request.httpMethod = "POST"
      request.setValue("application/json", forHTTPHeaderField: "Accept")
      
      //parameter array
      
      let uploadedFiles = [
         [imageUrl: "someimage.jpg"],
         [imageUrl: "someimage2.jpg"]
      ]
      
      request.httpBody = try! JSONSerialization.data(withJSONObject: uploadedFiles)
      
      Alamofire.request(request).responseJSON { response in
      
          switch (response.result) {
          case .success:
      
              //success code here
      
          case .failure(let error):
      
              //failure code here
          }
      }
      

      如果你可以在Sever端轻松更改格式,忽略上面的解决方案,改为字典

      [ "list_key" : [
             [imageUrl: "someimage.jpg"],
             [imageUrl: "someimage2.jpg"]
          ] 
       ]
      

      【讨论】:

      • Mani,你可能打错了:你建议的 JSON 仍然是一个数组,分别是无效的 JSON ;)
      • @CouchDeveloper 是的。我知道。但我没有设置Alamofire's params,而是直接设置httpbody。谁说字典数组不是有效的 JSON?
      • 嗯,您的 JSON 并不完全有效 - 它只是不是您所说的字典。它是 JSON 对象(字典)的 JSON 数组。如果您想将某种对象作为 JSON 发布,最好使用 JSON 对象(又名字典)作为根。如果要发布某种对象的数组,可以将 JSON 对象的 JSON 数组(作为这种对象)发布到服务器。我想我们同意 :) – CouchDeveloper 5 分钟前编辑
      • @CouchDeveloper 您可以使用 Foundation 框架的 JSONSerialization 类将 JSON 转换为 Swift 数据类型,例如 Dictionary, Array, String, Number, and Bool.. 参见此处 developer.apple.com/swift/blog/?id=37,因此对象不需要是字典为了将其转换为 JSON,它可以是上述任何一种类型。
      • 还有一点。是的it's best to use a JSON Object (aka Dictionary) as the root,但同时,如果根对象不是字典,我们不能说那不是 JSON。它也是 JSON。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      相关资源
      最近更新 更多