JSONSerialization возвращает false в приложении и true в почтальоне

Я использую Alamofire с SwiftyJSON для отправки HTTP-запросов. Опция в приложении позволяет пользователю выбрать продукт и связанную с ним переменную опцию. я использую JSONSerialization закодировать ответ JSON и отправить его обратно вместе с запросом.

При тестировании на Почтальоне я получаю положительный результат, а в приложении он возвращает ложный результат. Я часами пытался найти решение, но пока ничего.

Код для размещения запроса:

   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", "количество": "1", "опция": "{\" 2008 \ ": \" 7404 \ "}"]
Success returnData {"success": false, "error": {"option": {"2008": "Опция обязательна!"}}}

В то время как в Почтальоне, когда я использую следующие значения

{
"quantity": "1",
"product_id": "23490", 
"option": {"2008":7403}
}

Я получаю успешное возвращение = правда.

Я запутался, что я делаю не так?

1 ответ

ОК, чувак... здесь идет...

Ваша проблема со 2-й строкой:

Вы объявляете свой словарь с 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.

Вот пост, который вы можете найти полезным

Другие вопросы по тегам