如何使用 Alamofire 发布复合关键数据参数?

Posted

技术标签:

【中文标题】如何使用 Alamofire 发布复合关键数据参数?【英文标题】:How to post composite key data parameters with Alamofire? 【发布时间】:2017-09-07 06:03:17 【问题描述】:

我在服务器端有这样的数据。

对于 UserImagesTable,这些是我的参数

 

                 "status" : false,
                 "id" : 
                    "userId" : 1,
                    "imageId" : 1
                     

我需要通过 alamofire 和改造发布数据。

我试过这样:我为 userImages 表创建了一个模型类,为 userImages.id 表创建了一个模型类

我的模型类是:

       class UserImages

       
        var status : Bool? = nil
        var id : ImagesId? = nil

       func toJson() -> [String:Any] 

       return[

        "status" : status as Any!,
        "id" : id as ImagesId!
        ]
        
       


      class ImagesId
      
       var userId : Int16? = nil
       var imageId : Int16? = nil

       func toJson() -> [String:Any] 

       return[
        "userId" : userId as Any!,
        "imageId" : imageId as Any!,
        ]
        
        

然后是我的 Alamofire

               let ImageParams = UserImages()
               let ImageIdParams = ImagesId()

    ImageIdParams.imageId = 2
    ImageIdParams.userId = 3
    ImageParams.status = true
    favouriteVideoParams.id = ImageIdParams.toJson()-->this line coming some error like -->Cannot assign value of type '[String:any]' to type ImageId?

        Alamofire.request(url, method: .post, parameters: ImageParams.toJson(), encoding: JSONEncoding.default, headers: Defines.Constants.Headers)

我正在为帖子做什么,这种方法是否正确?如果可能的话,也给我一些关于改造帖子的想法。

【问题讨论】:

请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 【参考方案1】:

对于 Alamofire,您的 .toJSON 函数并不是真正需要的,更简单的解决方案是在函数中创建一个参数变量,该变量使用通过函数给出的预定义键和变量值来塑造参数,这看起来有点像像这样:

func postUserImageTable(with status: Bool?, and userImagesId: ImagesId?) 
   let url = "your url"
   let parameters = [
       "status": status!
       "id": [
            "userId": userImagesId?.userId
            "imageId": userImagesId?.imageId 
      ]
   ]
   Alamofire.request(url, method: .post, parameters: parameters)

根据 Alamofire 的官方文档 (Alamofire Post with JSON encoded Params)

对于 Retrofit,您可以使用 @body 标签将 pojo 类发布到您的服务器。因此,如果您有与 Swift 中显示的等价的 java 类,则如下:

public class UserImage 
  private Boolean status;
  private ImagesId imagesId;

  //constructor
  //getters and setters


public class ImagesId 
  private int userId, imageId;

  //constructor
  //getters and setters

然后您可以将此调用添加到您的改造服务中

@Post("your/post/url")
Response postUserImageTable(@Body UserImage body);

您可以在通话中使用它进行改造:

Call<Response> call = Service.postUserImageTable(new UserImage(false, new ImagesId(1,2));

call.enqueue(New Callback<Response> 
  //obligatory overrides from retrofit
)

【讨论】:

以上是关于如何使用 Alamofire 发布复合关键数据参数?的主要内容,如果未能解决你的问题,请参考以下文章

我如何请求参数 Alamofire 表单数据?

如何防止alamofire将“&”符号放在参数前面

我有一个将一些数据发布到服务器的 url。如何使用 URL 中提到的所有参数将其转换为 alamofire 发布请求方法

如何在响应闭包中访问 Alamofire 请求参数?

Swift 4:如何使用 Alamofire 在参数中发布文件?

带有 JSON 参数的多部分数据 Alamofire