简体   繁体   中英

How to access alamofire response

I'm new to iOS and I have some Swift code in app that's supposed to switch cases depending on the error message that I receive from the server. The message is wrapped and I'm having trouble getting to it. Here's the code

func sendAlamofireRequest(submissionURL: URL, parameters: Parameters, chosenTracker: String) -> String {

    var outputMessage = ""

    Alamofire.request(submissionURL, method: .post, parameters: parameters, encoding: JSONEncoding.default).validate().responseString() {
        response in
        switch response.result {
        case .success:
            print("Validation Successful...\(String(describing: response.value))")

            print("response value: \(String(response.value!))")
            switch response.value {
            case "error_none"?:
                outputMessage = "No matching Group Code. If you are having trouble, please go to \nhttps://app.phillyscientists.com"
                break
            case "error_tooManyIDs"?:
                outputMessage = "Error, please contact developer."
                break
            case "error_noGroupIDReceived"?:
                outputMessage = "Try Again."
                break
            default:

                let JSONResponse : JSON = JSON.init(parseJSON: response.result.value!)

                //uncomment this section for debugging
                //                        print("=================<JSON RESP>=================");
                //                        print(JSONResponse)
                //                        print("=================</JSON RESP/>=================");
                //
                let teacherNameGot = self.parseJSONData(json: JSONResponse, trackerValuePassed: chosenTracker)
                self.saveJSONDataToUserDefaults(teacher: teacherNameGot)

//                    outputMessage = "Logged In Successfully!"

                break
            }

        case .failure(let error):
            outputMessage = String(error.localizedDescription)
            print(outputMessage)

        }
    }
    return outputMessage
}

Here's the output from console:

Validation Successful...Optional("{\"Error\":\"error_none\"}")
response value: Optional("{\"Error\":\"error_none\"}")

How do I get to the value so that the switch case actually starts working? Thanks!

you can use Alamofire method .responseJSON which will give you an http object that has several attributes like request and response . Take this code as an example:

Alamofire.request("https://your-service-url.com/api", method: .post, parameters: paremeters, encoding: JSONEncoding.default, headers: headers).responseJSON{ (data) in

            guard let statusCode = data.response?.statusCode, statusCode == 200, let result = data.result.value as? [[String: Any]] else{
                print("Error with HTTP status \(data.response?.statusCode ?? 0)")

                return
            }
            var events : [Event] = []
            result.forEach({ (rawEvent) in
                events.append(Event(from: rawEvent))
            })


            handler(events, statusCode)
    }

Notice how I play there with the objects that .responseJSON provides, and how I get the resulting array from the service by accessing data.result.value (that being said this will depend on the data structure of your service response)

It seems that the output is in Json, so i'll need to map it into an object(or class,whatever you call it). If you think its not worth it, you can convert it into an Dictionary, i think it will work as well

@Gustavo caiafa is right, Mapping it to JSON did the trick. Here's the code for anyone who gets stuck on something similar:

Alamofire.request(submissionURL, method: .post, parameters: parameters, encoding: JSONEncoding.default).validate().responseString() { (response) in

        let outputResponseJSON : JSON = JSON.init(parseJSON: response.result.value!)
        let outputResponseText = JSON(outputResponseJSON)["Error"].stringValue

        switch response.result {
        case .success:
            print("Validation Successful...\(String(describing: response.value))")

            print("response value: \(String(describing: String(outputResponseText)))")
            switch outputResponseText {
            case "error_none":
                outputMessage = "No matching Group Code. If you are having trouble, please go to \nhttps://app.phillyscientists.com"
                print(outputMessage)
                break
            case "error_tooManyIDs":
                outputMessage = "Error, please contact developer."
                print(outputMessage)
                break
            case "error_noGroupIDReceived":
                outputMessage = "Try Again."
                print(outputMessage)
                break
            default:

                let JSONResponse : JSON = JSON.init(parseJSON: response.result.value!)

The answer is using SwiftyJSON for the outputResponseJSON and outputResponseText values.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM