我将Alamofire与SwiftyJSON一起用于发布HTTP请求。应用程序中的一个选项允许用户选择一种与产品相关的变量选项。我正在使用JSONSerialization
对JSON响应进行编码,并将其与请求一起发回。
在Postman上测试时,我得到了肯定的结果,而在应用程序中它返回了错误的结果。我一直在努力寻找解决方案,却一无所获。
发布请求的代码:
var optionDictionary = [String:AnyObject]()
var requstParams = [String:String]();
requstParams["product_id"] = self.productId
requstParams["quantity"] = self.quantityValue.text
do {
let jsonSortData = try JSONSerialization.data(withJSONObject: self.optionDictionary, options: [])
let jsonSortString = String(data: jsonSortData, encoding: .utf8)!
requstParams["option"] = jsonSortString
}
catch {
print(error.localizedDescription)
}
NetworkManager.sharedInstance.callingHttpRequest(params:requstParams, apiname:"api/addtoCart", cuurentView: self, method: .post, encoding: JSONEncoding.default){success,responseObject in
if success == 1{
let dict = responseObject as! NSDictionary;
NetworkManager.sharedInstance.dismissLoader()
self.view.isUserInteractionEnabled = true
if dict.object(forKey: "success") as! Int == 1{
let data = dict.object(forKey: "total") as! String
self.tabBarController!.tabBar.items?[3].badgeValue = data.components(separatedBy: " ")[0]
self.navigationCart(cartCount:data.components(separatedBy: " ")[0])
if self.goToBagFlag == true{
self.tabBarController!.selectedIndex = 3
}
}
}
}
Xcode调试器显示
url https://www.example.com/api/addtoCart
params [“ product_id”:“ 23490”,“ quantity”:“ 1”,“ option”:“ {\” 2008 \“:\” 7404 \“}”]
成功returnData {“成功”:false,“错误”:{“选项”:{“ 2008”:“需要选项!”}}}
在邮递员中,当我使用以下值时
{
"quantity": "1",
"product_id": "23490",
"option": {"2008":7403}
}
我得到一个成功的return = true。
我很困惑我在做什么错?
答案 0 :(得分:0)
好吧,伙计...在这里...
您的问题出在第二行:
您要以String
作为值来声明字典。
var requestParams = [String:String]()
API需要一个Int
作为值。
"option": {"2008":7403}
我建议您停止使用SwiftyJSON
,因为Codable
是“工厂”协议。您可以按照要对数据进行建模的方式对结构进行建模。在这种情况下,这就是原始JSON作为Codable
结构的样子。
struct Order: Codable {
let quantity: String
let productID: String
let option: [String: Int]
}
假设您要创建订单...这是您的处理方式:
let order = Order(quantity: "1",
productId: "23490",
option: ["2008":7403])
使用编码器时,您将像这样使用它:
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
convertToSnakeCase
会将JSON密钥从productId
转换为product_id
,并且您的声明将遵循Swift的camelCase约定。