Home > Net >  Simple post request in SwiftUI
Simple post request in SwiftUI

Time:08-12

I'm beginner in SwiftUI and I'm not familiar with variable management.

I'd like to send a very simple post request like this one with SwiftUI:

let full_path : String = "https://www.example.com/get_answer?my_message=current temperature"

I've tried with this piece of code but it didn't work.

if (URL(string: full_path) != nil) {
     let url = URL(string: full_path)!
     var request = URLRequest(url: url)

     request.httpMethod = "POST"
     var decodedAnswer =  String("")
     do {
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            print(response)
            decodedAnswer = String(decoding: response, as: UTF8.self)
        }
    }

I have the following error:

Value of optional type 'URLResponse?' must be unwrapped to a value of type 'URLResponse'

I don't know how to get the response.

How can I get the response from a simple Post request in SwiftUI?

CodePudding user response:

Multiple issues here.

  • You are trying to decode the URLResponse object, but what you want is the data object in the decoder.
  • You seem to not know about optionals. I would refer you to the basic Apple tutorials about this topic. You can find it with your favorite search engine.
  • You are in an async context here. Everything inside the url datasession closure will be execute after your network request returns. The code in your function will be completed by that moment and your var decodedAnswer will be out of scope. So move it out of the function in to the class/struct.

You probably want something like this:

This should be defined in class scope or you won´t be able to use it:

var decodedAnswer: String = ""

This should be in a function:

let full_path: String = "https://www.example.com/get_answer?my_message=current temperature"

if let url = URL(string: full_path) {
    
    var request = URLRequest(url: url)
    
    request.httpMethod = "POST"
    do {
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            //This converts the optionals in to non optionals that could be used further on
            //Be aware this will just return when something goes wrong
            guard let data = data, let response = response, error == nil else{

                print("Something went wrong: error: \(error?.localizedDescription ?? "unkown error")")
                return
            }
            
            print(response)
            
            decodedAnswer = String(decoding: data, as: UTF8.self)
        }
        
        task.resume()
    }
}
  • Related