나의 발자취

이어서 본문

앱 개발/iOS

이어서

달모드 2024. 11. 19. 15:10

addSale()

SaleViewModel.swift에서, 상품 등록에서 사진을 등록했을 때 전달해주는 것을 구현해줄것이다.

(잠깐 Postman을 켜서) 우리가 값만 넣을 때는 x-www-form-urlencoded로 보낸다.

우리는 이미지와 텍스트 등 여러가지 form을 보내므로, form-data 형식으로 보낸다. -> Swift의 MultipartData()를 사용할 것이다.

(참고로, json 구조가 복잡한 경우 raw 타입으로 보낼 수 있다.)

사진을 서버에서 여러 장 가져와야 하므로, MultipartData()의 인스턴스인 formData.append()를 써준다. 

 

* withName: 서버에서 key-value값 중 어떤 값으로 받아오는지를 확인한다. 

* 언랩핑을 했어도, 이 값 자체가 옵셔널이 오므로 .data() 뒤에 강제 언랩핑을 해준다. (지금은 이렇게 하는데 나중에는 확실히 해야해서 강제 언랩핑을 하면 안된다.)

 

이제까지 작성 내용

guard let imageData = image?.jpegData(compressionQuality: 0.2) else { return }
        let formData = MultipartFormData()
        formData.append(imageData, withName: "photo", fileName: "photo.jpg", mimeType: "image/jpeg")
        formData.append(productName!.data(using: .utf8)!, withName: "productName")
        formData.append(productName!.data(using: .utf8)!, withName: "description")
        formData.append(productName!.data(using: .utf8)!, withName: "price")

 

이제 userName의 경우는 UserDefaults로 가져와도 되지만, @AppStorage로 가져와도 된다.

let userName = UserDefaults.standard.string(forKey: "userName") 대신, @AppStorage("userName") 선언을 해주고 쓸것이다.

따라서 위의 token 변수의 AppStorage 프로퍼티 랩퍼 밑에 선언해주고,

 

밑에 값을 넣어준다.

만약 self.userName = "wizard" 라고 하면 @AppStorage("userName") var userName:String? 에다가 값을 적어주는 것이다.

 

//      위에서 @AppStorage("userName") 선언
        let userName = self.userName
//       만약 self.userName = "wizard" 라고 하면 @AppStorage("userName") var userName:String? 에다가 값을 적어주는 것이다.
        formData.append(userName!.data(using: .utf8)!, withName: "userName")

 

이어서 토큰, endpoint, 헤더를 작업해준다.

guard let token = self.token else { return }
        let headers: HTTPHeaders = [
            "Authorization": "Bearer \(token)",
            "Content-Type" : "multipart/form-data"
            ]
        let url = "\(endPoint)/sales"

 

AF에서 리퀘스트 처리

 

 

 

Comments