Swift - отправлять запросы с alamofire - PullRequest
0 голосов
/ 27 июня 2018

У меня небольшие проблемы с Alamofire. У меня есть функции сервера, которые успешно работают на устройствах Android. Все отлично работает и все данные работают без проблем. Но на iOS каждый раз, когда я отправляю запрос на публикацию с более чем 2 параметрами, я получаю сообщение об ошибке с сервера, поэтому я не могу опубликовать данные. Я пытался поместить post в виде строки в пользовательской кодировке, потому что, когда я помещал параметры в метод Alamofire.request, я также получал сообщение об ошибке, но тогда ответ сервера был «ошибка в обработчике удаления». Таким образом, я изменил весь JSON в строку благодаря расширению String, затем я изменил все "[" и "]" на "{", "}", но все равно не могу сохранить данные на сервер.

Кодированный словарь и преобразованный в JSON в Swift выглядит следующим образом:

звонки =% 7B% 220% 22% 3A% 7B% 22call% 5Fdate% 22% 3A% 222018% 2D06% 2D27% 2B11% 3A30% 3A46% 22% 2C% 22number% 22% 3A% 22462462432% 22% 2C% 22sms% 22% 3A% 220% 22% 2C% 22duration% 22% 3A% 220% 22% 2C% 22type% 22% 3A211% 7D% 7D

Словарь в Swift

["calls": ["0": ["call_date": "2018-06-27+11:49:18", "number": "56262621", "sms": "0", "duration": "0", "type": 211]]]

С другой стороны, то же приложение на Android прекрасно работает с теми же данными.

Кодированный JSON на Java выглядит следующим образом:

* Тысячу двадцать-два * звонки =% 7B% 220% 22% 3A% 7B% 22number% 22% 3A% 22852486258965% 22% 2C% 22duration% 22% 3A% 220% 22% 2C% 22type% 22% 3A211% 2C% 22call_date% 22% 3A% 222018-06-27 + 11% 3A53% 3A53% 22% 2C% 22sms% 22% 3A% 220% 22% 7D% 7D * * тысяча двадцать три

JSON на Java

{"calls":{"0":{"number":"852486258965","duration":"0","type":211,"call_date":"2018-06-27 11:53:53","sms":"0"}}}

Почему в Android App все работает, а на iOS - вообще не работает? У кого-нибудь есть идея для этого?

Функция в Swift

func sendStoreCalls(parameters: Dictionary<Int, Dictionary<String, Any>>) {

        var params: Parameters = [:]
        var par: Parameters = [:]
        var pa: [String:Any] = [:]
        var i = 0
        for (_, param) in parameters {
            if param["isSend"] as! Int == 0 {
                par["duration"] = param["callTime"]
                par["sms"] = "0"
                let callDate: String = param["callDate"] as! String
                par["type"] = param["callType"]
                par["call_date"] = callDate.replacingOccurrences(of: " ", with: "+", options: .literal, range: nil)
                if param["callNumber"] as! String != "" {
                    par["number"] = param["callNumber"]
                }
                params[String(i)] = par
                i += 1
            }
        }

        pa["calls"] = params

        let token: String = SharedPreferences.getPrefToken()!

        let bufferedParams = pa.queryParameters

        let transformedPar = bufferedParams.replacingOccurrences(of: "%5B", with: "%7B", options: .literal, range: nil).replacingOccurrences(of: "%5D", with: "%7D", options: .literal, range: nil)

        let trn = transformedPar.replacingOccurrences(of: "%C2A0", with: "", options: .literal, range: nil).replacingOccurrences(of: "%20", with: "", options: .literal, range: nil)

        let url = "https://url.com?api_token=\(token)"

        Alamofire.request(url, method: .post, encoding: JSONStringArrayEncoding.init(string: trn))
            .responseJSON {
                response in
                print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue)!)
                switch response.result {
                case .success(let value):
                    let json = JSON(value)
                    print(json["message"].rawString()!)
                case .failure(let error):
                    if let data = response.data {
                        print("ERROR!!!")
                        print(String(data: data, encoding: String.Encoding.utf8)!)
                    }
                    print(error)
                }
            }
    }

1 Ответ

0 голосов
/ 27 июня 2018

Попробуйте этот метод с / без параметра кодирования, а также добавив / удалив заголовок ["Content-Type": "application / json"]

func request(_ method: HTTPMethod
    , _ URLString: String
    , parameters: [String : AnyObject]? = [:]
    , headers: [String : String]? = [:]
    , onView: UIView?, vc: UIViewController, completion:@escaping (Any?) -> Void
    , failure: @escaping (Error?) -> Void) {


    Alamofire.request(URLString, method: method, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
        .responseJSON { response in

            switch response.result {
            case .success:
                completion(response.result.value!)
            case .failure(let error):
                failure(error)
                guard error.localizedDescription == JSON_COULDNOT_SERIALISED else {
                    AppUtil().showMessage((error.localizedDescription), messageTitle: EMPTY_STRING, buttonTitle: OK, vc: vc)
                    return
                }
                //                    AppUtil.showMessage(SOMETHING_WNET_WRONG, messageTitle: EMPTY_STRING, buttonTitle: OK)
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...