有没有办法在 Alamofire 中将数据作为对象而不是参数发送?

Posted

技术标签:

【中文标题】有没有办法在 Alamofire 中将数据作为对象而不是参数发送?【英文标题】:Is there any way to send data as object instead of Parameter in Alamofire? 【发布时间】:2019-01-19 15:24:59 【问题描述】:

我想这样发送数据:

 "userName" : username,"password" : password,"city" : [ "name":name, "address":address ,"lat":lat  , "name":name ,"address":address ,"lat":lat ]

但是,Alamofire 只接受这样的参数:

[ "userName" : username, "password" : password,"city" : [ ["name":name, "address":address ,"lat":lat ] , ["name":name ,"address":address ,"lat":lat ]]]

即使我发送如下数据:

[ "userName" : username, "password" : password, "city" : ["name":name, "address":address ,"lat":lat  , "name":name ,"address":address ,"lat":lat ]]

而且,它不接受 JSON 类型作为我数据中的城市值!

我得到错误:原因:'Invalid type in JSON write (_SwiftValue)' 有谁知道解决办法吗?

【问题讨论】:

【参考方案1】:

只需将参数放入字典中,并将alamofire请求方法中的编码设置为JsonEncoding.default

【讨论】:

请检查响应代码,然后从服务器打印响应,看看您是否发送了正确的参数【参考方案2】:

您可以通过 alamofire 发送可编码对象,方法是将其传递给参数参数,如下所示:https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#request-parameters-and-parameter-encoders

所以你可以创建一个描述你的数据的快速结构:

struct Something: Codable 
    let userName: String
    let password: String
    let city: [City]


struct City: Codable 
    let name: String
    let address: String
    let lat: String

然后使用您的数据创建这样的对象以通过 alamofire 发送:

let encodableObject = Something(userName: userName, password: password, city: [City(name: name, address: address, lat: lat)])

AF.request("www.someApiEndpoint.com", method: method, parameters: encodableObject, encoder: JSONParameterEncoder.prettyPrinted, headers: headers)

【讨论】:

【参考方案3】:

试试这个扩展。

创建一个应用了可编码协议的对象。

struct JSON 
    static let encoder = JSONEncoder()


extension Encodable 
    
    subscript(key: String) -> Any? 
        return dictionary[key]
    
    
    // Convert an Encodable Object into dictionary
    var dictionary: [String: Any] 
        get 
            return (try? JSONSerialization.jsonObject(with: JSON.encoder.encode(self))) as? [String: Any] ?? [:]
        
    
    

创建您的可编码对象并使用dictionary getter,以便它会自动为您返回字典。这是请求函数的示例。

func postWithHeader<T>(url : String, params : T?, onCompletion : @escaping (Data?, NetworkError?)->Void) where T : Encodable 
        print("----------> URL : \(url)")
        print("            Params  : \(String(describing: params?.dictionary ?? nil))")

        session.request(url, method: .post, parameters: (params).dictionary, encoding: JSONEncoding.default, headers: getHeader()).responseData  response in
            print("<---------- URL : \(url)")
            NetworkManager.printData(response: response)
    

它不会发送整个对象,因为 alamofire 不允许它。所以我们必须即兴发挥一点???

【讨论】:

【参考方案4】:
struct Login: Encodable 
    let email: String
    let password: String


let login = Login(email: "test@test.test", password: "testPassword")

AF.request("https://httpbin.org/post",
           method: .post,
           parameters: login,
           encoder: JSONParameterEncoder.default).response  response in
    debugPrint(response)

您可以在 Alamofire GitHub 存储库中找到其他示例:https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#request-parameters-and-parameter-encoders

【讨论】:

以上是关于有没有办法在 Alamofire 中将数据作为对象而不是参数发送?的主要内容,如果未能解决你的问题,请参考以下文章

如何在alamofire中将参数作为字符串发送

在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)

如何在 Alamofire,swift 3 中将字典作为参数发送

在 Alamofire Swift 3 中将数组作为参数发送

CSS:有没有办法在我的输出中将属性的内容作为文本插入?

如何在 Swift 3 中使用 Alamofire 在 POST 请求中将给定的 JSON 作为参数发送?