принимая Java-запрос http для функции firebase и помещая его в swift - PullRequest
0 голосов
/ 23 ноября 2018

Я исследовал это онлайн, но ничто не похоже на код, который у меня есть.

Я пытаюсь работать с функциями Firebase в приложениях для Android и iOS.Я следовал учебному пособию, и он хорошо работал в Android, потому что он был сделан в Android, но я хочу сделать то же самое в iOS.

Мне сказали, что Alamofire, сравнимый с OkHttp в Android, был подходящим способом, ноЯ не уверен, как взять код, который у меня есть в Android, и поместить его в код SWIFT, чтобы он делал то же самое.

Любая помощь будет принята с благодарностью.

Кодкоторый использовался в Android

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();
        }
    });
}

РЕДАКТИРОВАТЬ - Преобразование

Это то, что я смог преобразовать вместе с кодом, представленным @emrepun:

// HTTP Request .... (firebase functions)
    MEDIA_TYPE.setValue("application/jston", forHTTPHeaderField: "Content-Type")

    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)
                }
            }
    }

1 Ответ

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

Вы можете сделать сетевой запрос похожим на вашу версию Java с Alamofire, как указано ниже.Вы также должны узнать о том, как анализировать JSON с помощью swift.Возможно, вы захотите взглянуть на Codable, который облегчает анализ JSON.Или вы можете попробовать среду под названием "SwiftyJSON", которая также удобна для обработки запросов json.

    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.
        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)
            }
        }
    }
...