-2

I am new in Swift and SwiftUI. I need to send a POST request to the server when a button is clicked. The request is sent, everything is fine.

ShareHelper.swift:

import Foundation

class ShareHelper {

    var dataString: String = ""
    var newsMessage: String
    var newsUser: String
    var newsEmail: String
    var newsMedia: String
    let newsAPI: String = "https://example.com/api/shareNews"

    init(message: String, user: String, email: String, media: String) {
        self.newsMessage = message
        self.newsUser = user
        self.newsEmail = email
        self.newsMedia = media
        self.RequestPost()
    }

    func RequestPost() {
        let url = URL(string: self.newsAPI)
        guard let requestUrl = url else { fatalError() }
        var request = URLRequest(url: requestUrl)
        request.httpMethod = "POST"
        let postString = "message=\(self.newsMessage)&user=\(self.newsUser)&email=\(self.newsEmail)&media=\(self.newsMedia)"
        request.httpBody = postString.data(using: String.Encoding.utf8)
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if error != nil {
                return
            }
            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                self.dataString = dataString
            }
        }
        task.resume()
    }

}

Button from ContentView.swift

Button(action: {
    let shareHelper = ShareHelper(message: self.textAreaText, user: self.inputUser, email: self.inputEmail, media: self.inputMedia)
    shareHelper.RequestPost()
    print("Share helper: \(shareHelper.dataString)")
}, label: {
    Text("Send")
})

How to make a message appear in the console if POST request successful sending?

LeXxyIT
  • 204
  • 2
  • 15

1 Answers1

1

You need to use completion block.

func RequestPost(completion: @escaping((String) -> Void)) {
    let url = URL(string: self.newsAPI)
    guard let requestUrl = url else { fatalError() }
    var request = URLRequest(url: requestUrl)
    request.httpMethod = "POST"
    let postString = "message=\(self.newsMessage)&user=\(self.newsUser)&email=\(self.newsEmail)&media=\(self.newsMedia)"
    request.httpBody = postString.data(using: String.Encoding.utf8)
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if error != nil {
            return
        }
        if let data = data, let dataString = String(data: data, encoding: .utf8) {
            DispatchQueue.main.async {
                self.dataString = dataString
                completion(dataString)
            }
        }
    }
    task.resume()
}

And on button

Button(action: {
    let shareHelper = ShareHelper(message: "self.textAreaText", user: "self.inputUser", email: "self.inputEmail", media: "self.inputMedia")
    shareHelper.RequestPost { (dataString) in
        print("Share helper: \(shareHelper.dataString)")
        // Or
        print("Share helper: \(dataString)")
    }
    
}, label: {
    Text("Send")
})
Wai Ha Lee
  • 8,598
  • 83
  • 57
  • 92
Raja Kishan
  • 16,767
  • 2
  • 26
  • 52