Day23 URLSession 03 - PUT / PATCH

PUT / PATCH:修改资料

一样的模式再来一次,根据以上的Reqres API 来示范

首先一样根据Response 建立Model

User.swift :

struct UserUpdateResponse: Decodable {
    var name: String
    var job: String
    var updatedAt: Date?
    
    var modifiedUpdateAt: String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium
        if let newDate = updatedAt {
            return dateFormatter.string(from: newDate)
        } else {
            return "******"
        }
    }
    
    enum CodingKeys: String, CodingKey {
        case name
        case job
        case updatedAt
    }
}

接着在UserURLSession.swift处理关於URLSession的事件

    func userUpdateRequest(userRequestBody:UserRequestBody,completionHandler: @escaping (UserUpdateResponse) -> Void) {
        
        let url = URL(string: "https://reqres.in/api/users/2")!
        
        // MARK: URLRequest
        var request = URLRequest(url: url)
        request.httpMethod = "PUT"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        //MARK: POST Request V.1.0
        guard let httpBody = try? JSONEncoder().encode(userRequestBody) else {
            print("Invalid httpBody")
            return
        }
        
        // MARK: Set httpBody
        request.httpBody = httpBody
        
        URLSession.shared.dataTask(with: request) {
            data, response, error in
            if let data = data {
                do {
                    let decoder = JSONDecoder()
                    
                    decoder.dateDecodingStrategy = .formatted(DateFormatter.customFormatter)
                    
                    let user = try decoder.decode(UserUpdateResponse.self, from: data)
                    
                    completionHandler(user)
                    
                }catch(let error) {
                    print(error.localizedDescription)
                }
            } else {
                print("No Data")
            }
        }.resume()
    }
    
}

之後在View 设计画面并使用
UPDATESampleView.swift

import SwiftUI

struct UPDATESampleView: View {
    @State private var name = "Ryder"
    @State private var job = "Engineer"
    
    @State var user :UserUpdateResponse = UserUpdateResponse(name: "*****", job: "*****", updatedAt: nil)
    
    var body: some View {
        NavigationView {
            VStack {
                List(){
                    Text("UPDATE sample")
                    Section(header: Text("Request Data")) {
                        TextField("Name: ", text: $name)
                        TextField("Job: ", text: $job)
                    }
                }
                List() {
                    Section(header: Text("Response Data")) {
                        Text("Name: \(user.name)")
                        Text("Job: \(user.job)")
                        Text("Date updated: \(user.modifiedUpdateAt)")
                    }
                }
                .listStyle(GroupedListStyle())
                Button {
                    UserURLSession.shared.userUpdateRequest(userRequestBody: UserRequestBody(name: name, job: job)) { newUser in
                        DispatchQueue.main.async {
                            user = newUser
                        }
                    }
                    
                } label: {
                    Text("UPDATE Request")
                }
                .padding()
                .foregroundColor(Color.white)
                .background(Color.green)
                .cornerRadius(8)
                
            }
            .navigationBarTitleDisplayMode(.inline)
            .navigationTitle(Text("URLSession UPDATE Sample"))
        }
        
    }
}

struct UPDATESampleView_Previews: PreviewProvider {
    static var previews: some View {
        UPDATESampleView()
    }
}

这边所有URLSession 的范例一起放在Github: URLSessionSample 供大家参考


<<:  Day23 Plugin 从零开始到上架 - ActivityAware 介绍

>>:  Day 25. Zabbix 实际报警案例分享 - 帐号资料被异动

工作排程器--Windows的忠实程序秘书

今天要来介绍一个Windwos内建工具叫做工作排程器(Task Scheduler),他可以预先计划...

Day 28 JavaScript < 简单介绍>

1.JS是什麽? Java Script 是一种运行在客户端的脚本语言 (script就是脚本的意思...

爲什麽我的Mac运行缓慢?解决办法是什麽?

无论您拥有 iMac、MacBook、Mac mini 还是 Mac Pro,电脑在使用一段时间後都...

Day 5 基本 flask 函式 (2)

前言 今天会继续探讨其他的 flask 的函式。如果说昨天的函式是用来给予使用者回应,那今天提到的函...

[FHIR 从入门到放弃] Day 01-简介

在开始之前 前言 其实本来是没想到要写这篇的,毕竟平常生活跟工作已经够忙碌QQ 由於目前主要研究的是...