有没有办法在 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 中将数据作为对象而不是参数发送?的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)
如何在 Alamofire,swift 3 中将字典作为参数发送