如何将Firebase功能的Android代码转换为Swift代码?

时间:2018-11-24 23:02:19

标签: android json swift

根据我的研究,将Android代码转换为Swift代码没有太多帮助。在一些帮助下,我们能够翻译或转换一些代码,但还没有完成。运行代码时,出现错误:

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

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

需要转换为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();
    }
});
}

上面的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)

更新的快速代码

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)

请记住,在我的网址中,我的应用程序未称为“ myapp”,它只是用于保护。

2 个答案:

答案 0 :(得分:1)

我认为代码中有两个问题:

  1. 在Android代码中,您需要在请求正文中设置参数 uid 电子邮件,而在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)

尝试一下,看看它是否有效。

答案 1 :(得分:1)

所以我会在这里这样做:

    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并能够对其进行解析。您能否评论您的响应对象的外观,然后再评论您如何解析它并访问正确的元素。否则我只能猜测。