Ошибка сериализации ответа Alamofire - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь создать приложение, которое использует Stripe и Alamofire для обработки платежей. У меня он работал в один момент, потом он просто перестал работать, но я не уверен, было ли это из-за обновления или ошибки. Я также использую Heroku для запуска файла бэкэнда Nodejs, и я не получаю никаких ошибок на стороне сервера, и в Stripe проходят тестовые платежи. Это похоже на то, как будто Heroku не отправляет правильный тип файла обратно в мое приложение.

Я получаю эту ошибку.

===========Error===========
Error Code: 10
Error Messsage: Response could not be serialized, input data was nil or zero length.
Alamofire.AFError.responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
===========================

код:

import Foundation
import Stripe
import Alamofire

class StripeClient {

    static let sharedClient = StripeClient()

    var baseURLString: String? = nil

    var baseURL: URL{
        if let urlString = self.baseURLString, let url = URL(string: urlString) {
            print(url)
            return url
        } else {
            fatalError()
        }

    }

    func createAndConfirmPayment(_ token: STPToken, amount: Int, completion: @escaping (_ error: Error?) -> Void) {

        let url = self.baseURL.appendingPathComponent("charge")
        print(url)
        let params: [String : Any] = ["stripeToken" : token.tokenId, "amount" : amount, "description" : Constats.defaultDescription, "currency" : Constats.defaultCurrency]

        AF.request(url, method: .post, parameters: params)
            .validate(statusCode: 200..<300)
            .responseData(completionHandler: { (response) in
                print(response)

                switch response.result {
                case .success( _):
                    print("Payment successful")
                    completion(nil)
                case .failure(let error):
                    if (response.data?.count)! > 0 {print(error)}
                    print("\n\n===========Error===========")
                    print("Error Code: \(error._code)")
                    print("Error Messsage: \(error.localizedDescription)")
                    if let data = response.data, let str = String(data: data, encoding: String.Encoding.utf8){
                        print("Server Error: " + str)
                    }
                    debugPrint(error as Any)
                    print("===========================\n\n")
                    print("error processing the payment", error.localizedDescription)
                    completion(error)
                }

            })

        }
    }

I Я использую Stripe 18.4, Alamofire 5.0, Xcode 11.3 и Swift 5 Спасибо!

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Эта ошибка означает, что у Alamofire неожиданно не было Data для обработки при попытке проанализировать ответ. Вы можете запустить debugPrint(response), чтобы увидеть гораздо больше подробностей об ответе, но обычно это происходит, когда сервер возвращает пустой ответ без правильного кода 204 или 205 (обычно 200), чтобы указать, что ответ должен быть пустым. Если это так, вы можете настроить ваш сериализатор ответов, создав экземпляр напрямую:

let serializer = DataResponseSerializer(emptyResponseCodes: Set([200, 204, 205]))

// Use it to process your responses.

AF.request(...)
  .validate()
  .response(responseSerializer: serializer) { response in 
    // Process response.
  }
0 голосов
/ 07 марта 2020

Сначала проверьте, действительны ли данные, отправленные с сервера. json возможно, запустив почтальон и проверив полученный json.

Или попробуйте отправить тип кодировки в запросе. например, если JSON или urlEncoded.

для json:

`encoding: JSONEncoding.default`

для параметров, закодированных в URL:

encoding: URLEncoding.default
...