JSONSerialization возвращает false в приложении и true в почтальоне - PullRequest
0 голосов
/ 06 декабря 2018

Я использую 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", "amount": "1", "option": "{\" 2008 \ ": \" 7404 \ "}"]
Success returnData {"success": false, "error": {"option":{"2008": "Требуется опция!"}}}

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

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

, я получаю успешное возвращение = true.

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

1 Ответ

0 голосов
/ 06 декабря 2018

ОК, чувак ... вот так ...

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

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

Вот пост , который вам может пригодиться

...