본문 바로가기

iOS

[iOS] multipart/form-data 형식으로 서버에 request요청하기!

  func postProduct(imageNamed:String, name: String, discountedPrice: Int, price: Int, currency: String, stock: Int, descriptions: String) {
    // URL생성
    guard let url = URL(string: "https://market-training.yagom-academy.kr/api/products") else {
      return
    }
    // boundardy생성
    let boundary = UUID().uuidString
    
    // request생성 및 identifier와 content-Type을 값을 저장
    var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
    request.httpMethod = "POST"
    request.addValue("cd706a3e-66db-11ec-9626-796401f2341a", forHTTPHeaderField: "identifier")
    request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    
    // imgData생성
    guard let imageData = UIImage(named: imageNamed)?.jpegData(compressionQuality: 1) else {
      return
    }
    
    // data생성 및 body작성 후 reuqest.httpBody에 저장 ( params, images )
    var data = Data()
      // params 데이터 작성
    data.appendString("\r\n--\(boundary)\r\n")
    data.appendString("Content-Disposition: form-data; name=\"params\"\r\n\r\n")
    data.appendString("""
                      {
                      \"name\": \"\(name)\",
                      \"price\": \(price),
                      \"currency\": \"\(currency)\",
                      \"secret\": \"password\",
                      \"descriptions\": \"desc\"
                      }
                      """)
    
      // image 데이터 작성
    data.appendString("\r\n--\(boundary)\r\n")
    data.appendString("Content-Disposition: form-data; name=\"images\"; filename=\"\(imageNamed).jpg\"\r\n")
    data.appendString("Content-Type: image/jpg\r\n\r\n")
    data.append(imageData)
    data.appendString("\r\n--\(boundary)--\r\n")
    
    request.httpBody = data
    
    // URLSession.dataTask로 네트워크에 request 요청
    self.request(request: request) {
      guard let result = try? $0.get() else {
        return
      }
      dump(result)
    }
  }
}

extension Data {
  mutating func appendString(_ string: String) {
    if let data = string.data(using: .utf8) {
      self.append(data)
    }
  }
}

 

# Reference

- https://lena-chamna.netlify.app/post/uploading_array_of_images_using_multipart_form-data_in_swift/