代码之家  ›  专栏  ›  技术社区  ›  LizG

获取firebase函数的JavaHTTP请求并放入swift

  •  0
  • LizG  · 技术社区  · 7 年前

    我在网上对此进行了研究,但没有任何东西像我的代码一样。

    有人告诉我,Alamofire可以与Android中的OkHttp相媲美,但我不确定如何将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();
            }
        });
    }
    

    编辑转换

    这就是我能够转换成的内容以及@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 回复  |  直到 7 年前
        1
  •  1
  •   emrepun    7 年前

    您可以使用Alamofire发出类似于Java版本的网络请求,如下所示。您还应该了解如何使用swift解析JSON。您可能想看看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)
                }
            }
        }
    
    推荐文章