Как перевести мой код Android в код Swift для моей функции Firebase? - PullRequest
0 голосов
/ 25 ноября 2018

Судя по моим исследованиям, нет особой помощи в переводе кода Android в код Swift.С некоторой помощью мы смогли перевести или преобразовать часть кода, но он еще не закончен.Когда я запускаю код, я получаю сообщение об ошибке:

Response could not be serialized, input data was nil or zero length.

responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

Код Android, требующий преобразования в код Swift:

public static final MediaType MEDIA_TYPE = MediaType.parse("application/json");
ProgressDialog progress;

private void payoutRequest() {

progress = new ProgressDialog(this);
progress.setTitle("Processing your payout ...");
progress.setMessage("Please Wait .....");
progress.setCancelable(false);
progress.show();

// HTTP Request ....
final OkHttpClient client = new OkHttpClient();

// in json - we need variables for the hardcoded uid and Email
JSONObject postData = new JSONObject();

try {
    postData.put("uid", FirebaseAuth.getInstance().getCurrentUser().getUid());
    postData.put("email", mPayoutEmail.getText().toString());

} catch (JSONException e) {
    e.printStackTrace();
}

// Request body ...
RequestBody body = RequestBody.create(MEDIA_TYPE, postData.toString());

// Build Request ...
final Request request = new Request.Builder()
        .url("https://us-central1-myapp.cloudfunctions.net/payout")
        .post(body)
        .addHeader("Content-Type", "application/json")
        .addHeader("cache-control", "no-cache")
        .addHeader("Authorization", "Your Token")
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // something went wrong right off the bat
        progress.dismiss();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        // response successful ....
        // refers to response.status('200') or ('500')
        int responseCode = response.code();
        if (response.isSuccessful()) {
            switch(responseCode) {
                case 200:
                    Snackbar.make(findViewById(R.id.layout),
                            "Payout Successful!", Snackbar.LENGTH_LONG)
                            .show();
                    break;

                case 500:
                    Snackbar.make(findViewById(R.id.layout),
                            "Error: no payout available", Snackbar
                                    .LENGTH_LONG).show();
                    break;

                default:
                    Snackbar.make(findViewById(R.id.layout),
                            "Error: couldn't complete the transaction",
                            Snackbar.LENGTH_LONG).show();
                    break;
            }

        } else {
            Snackbar.make(findViewById(R.id.layout),
                    "Error: couldn't complete the transaction",
                    Snackbar.LENGTH_LONG).show();
        }

        progress.dismiss();
    }
});
}

Код Swift, используемый из вышеуказанного кода Android:

let url = "https://us-central1-myapp.cloudfunctions.net/payout"
let headers: HTTPHeaders = [
    "Content-Type": "application/json",
    "cache-control": "Your Token"]

Alamofire.request(url, method: .get, headers: headers).validate().responseJSON { (response) in
     switch response.result {
        case .success(let value):
            // you fall here once you get 200 success code, because you use .validate() when you make call.
            print(value)
            // parse your JSON here.
            let parameters : [String: Any] =
                ["uid": FIRAuth.auth()!.currentUser!.uid,
                 "email": self.paypalEmailText.text!]

            let postData = try! JSONSerialization.data(withJSONObject: parameters, options: [])

        case .failure(let error):
            if response.response?.statusCode == 500 {
                print("Error no payout available")
                print(error.localizedDescription)
            } else {
                print("Error: couldn't complete the transaction")
                print(error.localizedDescription)
            }
        }
}

Как я могу преобразовать код Android в код Swift или узнать, что я делаю неправильно?Этот код используется для публикации в функции, которую я создал для Firebase.

Редактировать

С помощью кода, приведенного в этом сообщении, я смог придумать этот код, но этовсе еще появляется с той же ошибкой:

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

обновленный код swift

let url = "https://us-central1-myapp.cloudfunctions.net/payout"
    let headers: HTTPHeaders = [
        "Content-Type": "application/json",
        "cache-control": "Your Token"]

    let params : [String: Any] = [
        "uid": FIRAuth.auth()!.currentUser!.uid,
        "email": self.paypalEmailText.text!]

    Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).validate().responseJSON { (response) in
         switch response.result {
            case .success(let JSON):
               print("Success with JSON: \(JSON)")
               if (response.result.value as? [String:AnyObject]) != nil {
                // Access your response here
                print(response.result.value!)
               }

            break

            case .failure(let error):
                if response.response?.statusCode == 500 {
                    print("Error no payout available")
                    print(print("Request failed with error: \(error.localizedDescription)"))

                } else {
                    print("Error: couldn't complete the transaction")
                    print("\n\n===========Error===========")
                    print("Error Code: \(error._code)")
                    print("Error Messsage: \(error.localizedDescription)")

                }
            }

         print("response \(response)")
    }

РЕДАКТИРОВАТЬ # 2

Я изменил свой метод:

let url = "https://us-central1-myapp.cloudfunctions.net/payout"

    let headers: HTTPHeaders = [
        "cache-control": "no-cache",
        "Authorization": "Your Token",
        "Content-Type": "application/json"]

    let parameters : [String: Any] = [
            "uid": uid,
            "email": self.paypalEmailText.text!
    ]

    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).validate(statusCode: 200..<600).responseJSON { (response) in

        print("Request: \(String(describing: response.request))") // original url request
        print("Result: \(response.result)") // response serialization result

        if response.response?.statusCode == 200 {

            print("Success with JSON: \(String(describing: response.result.value))")

        } else {
            let error = (response.result.value  as? [[String : AnyObject]])
            print(error as Any)
        }

        print("response \(response)")
    }

Ответ и распечатки:

Request: Optional(https://us-central1-myapp.cloudfunctions.net/payout)
Result: FAILURE
Success with JSON: nil
response FAILURE: responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

Имейте в виду, в моем URL мое приложение не называется "myapp", оно просто естьдля защиты.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Итак, я бы сделал это следующим образом:

    let url = "https://us-central1-myapp.cloudfunctions.net/payout"
    let headers: HTTPHeaders = [
        "Content-Type": "application/json",
        "cache-control": "Your Token"
    ]

    Alamofire.request(url,
                      method: .get,
                      encoding: JSONEncoding.default,
                      headers: headers).responseJSON
        { response in
            switch response.result {
            case .success(let JSON):
                print("Success with JSON: \(JSON)")
                // parse your JSON here something like
                if let json = response.result.value as? [String:AnyObject] {
                    // Access your response here
                }
                break
            case .failure(let error):
                print("Request failed with error: \(error)")
            }
    }

В успешной части вы сможете получить доступ к JSON и проанализировать его.Можете ли вы прокомментировать, как выглядит ваш объект ответа, тогда я прокомментирую, как вы анализируете его и получаете доступ к правильным элементам.В противном случае я могу только догадываться.

0 голосов
/ 25 ноября 2018

Я думаю, что в коде есть две проблемы:

  1. В коде Android вы устанавливаете параметры uid и email в тело запроса , тогда как в коде Swift эти параметры задаются в теле ответа , что неверно (поскольку к тому времени, когда вы получили ответ, запрос уже завершен безТитулы).
  2. Если вы хотите задать тело для запроса, используйте метод HTTP (второй параметр Alamofire.request должен быть post вместо get .

Вам нужно установить параметры в теле запроса и задать метод HTTP как post , как показано ниже:

let parameters: [String: Any] =
             ["uid": FIRAuth.auth()!.currentUser!.uid,
              "email": self.paypalEmailText.text!]

Alamofire.request(url, method:.post, parameters:parameters, 
                  encoding: JSONEncoding.default, headers:headers)

Попробуйте и посмотрите, работает ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...