Creating a Todo item

To create a Todo item, we can call sendRequest function in our MasterViewController viewDidLoad() method to be sure that it is working:

let newRequest = TodoRequest(id: 1,
name: "First request",
description: "description",
notes: "notes",
completed: false)

sendRequest(Alamofire.Method.POST, request: newRequest)

This should add a new Todo item to our backend.

Our sendRequest method is incomplete and it does not provide a call back to receive the data. Let's improve it:

func sendRequest(method: Alamofire.Method,
request: RequestProtocol,
completion: @escaping (_ responseData: AnyObject?,
_ error: Error?) -> Void) {

// Add Headers
let headers = configureHeaders(request)

// Fetch Request
Alamofire.request(method, "http://localhost:8080/todo/",
headers: headers, encoding: .JSON)
.validate()
.responseJSON { response in
if (response.result.error == nil) {
debugPrint("HTTP Response Body: (response.data)")
completion(response.result.value, nil)
} else {
debugPrint("HTTP Request failed:
(response.result.error)")
completion(nil, response.result.error)
}
}
}

We added a closure as the function argument and called the closure in the body of the function. To test it, we will update our call in MasterViewController:

let newRequest = TodoRequest(id: 1,
name: "First request",
description: "description",
notes: "notess",
completed: false)
sendRequest(method: Alamofire.Method.POST, request: newRequest) {
(response, error) in
if error == nil {
let todos: [Todo]? = decode(response!)
print("request was successfull: (todos)")
} else {
print("Error")
}
}

Here, we pass a trailing closure in our call; once it is called, we receive the response or error. Importing and using Argo, we can map the payload to our model. We called this function only for testing and we need to move this call to the proper place. After all, none of our ViewController classes will be able to call this function directly and they have to go through other objects. Also, we will need to improve our sendRequest function to take the proper url:

enum Urls { 
case postTodo
case getTodos
case getTodo
case deleteTodo
case deleteAll
case update
}

extension Urls {
func httpMethodUrl() -> (String, String) {
let baseUrl = "http://localhost:8080/"
switch self {
case .postTodo:
return ("POST", "(baseUrl)postTodo")
case .getTodos:
return ("GET", "(baseUrl)todos")
case .getTodo:
return ("GET", "(baseUrl)todo")
case .deleteTodo:
return ("DELETE", "(baseUrl)deleteTodo")
case .deleteAll:
return ("DELETE", "(baseUrl)deleteAll")
case .update:
return ("POST", "(baseUrl)updateTodo")
}
}
}

Here, we define an enum and extend it. In our httpMethodUrl function, we perform pattern matching to return a tuple consisting of an HTTP request method and the full url. We need to change our sendRequest function as follows:

import Alamofire 

func sendRequest(_ url: Urls,
request: RequestProtocol,
completion: @escaping (_ responseData: AnyObject?,
_ error: Error?) -> Void) {
// Add headers
let headers = configureHeaders(request)
// Get request method and full url
let (method, url) = url.httpMethodUrl()
var urlRequest = URLRequest(url: URL(string: url)!)
urlRequest.httpMethod = method
urlRequest.allHTTPHeaderFields = headers

// Fetch request
let manager = Alamofire.SessionManager.default
manager.request(urlRequest as URLRequestConvertible)
.validate()
.responseJSON {
response in
if (response.result.error == nil) {
debugPrint("HTTP Response Body: (response.data)")
completion(response.result.value as AnyObject?, nil)
} else {
debugPrint("HTTP Request failed:
(response.result.error)")
completion(nil, response.result.error)
}
}
}

And our function call should be changed as follows:

let newRequest = TodoRequest(id: 1,
name: "First request",
description: "description",
notes: "notess",
completed: false)

sendRequest(Urls.PostTodo, request: newRequest) { (response, error) in
if error == nil {
let todos: [Todo]? = decode(response!)
print("request was successfull: (todos)")
} else {
print("Error")
}
}
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset