Я пытаюсь решить, как загрузить набор параметров и файл изображения в мой API с помощью swift.
Мой код примерно в этой точке:
//parameters
let actualParameters = ["email": myEmail, "token": myToken, "certnbr": certnbr, "title": title, "newCert": newCert, "expires": expires, "expiryDate": expiryDate, "issueDate": issueDate] as! [String : Any]
let parameters = NewCertModel(email: "email")
//create the url with URL
let url = URL(string: "http://127.0.0.1:8000/api/newCertification/")!
//now create the URLRequest object using the url object
var request = URLRequest(url: url)
request.httpMethod = "POST"
let boundary = "Boundary-\(UUID().uuidString)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.httpBody = createBody(parameters: params,
boundary: boundary,
data: UIImageJPEGRepresentation(chosenImage, 0.7)!,
mimeType: "image/jpg",
filename: "hello.jpg")
guard let uploadData = try? JSONEncoder().encode(parameters) else {
print("Error Upload Data")
return
}
//new session
URLSession.shared.uploadTask(with: request as URLRequest, from: jsonData as! Data) { (responseData, response, error) in
// Check on some response headers (if it's HTTP)
if let httpResponse = response as? HTTPURLResponse {
switch httpResponse.statusCode {
case 200..<300:
print("Success")
case 400..<500:
print("Request error")
case 500..<600:
print("Server error")
case let otherCode:
print("Other code: \(otherCode)")
}
}
// Do something with the response data
if let
responseData = responseData,
let responseString = String(data: responseData, encoding: String.Encoding.utf8) {
print("Server Response:")
print(responseString)
}
// Do something with the error
if let error = error {
print(error.localizedDescription)
}
}
.resume()
}
}
Код не идеален, потому что я пробовал довольно много решений, и теперь они немного перемешаны.Я могу легко передавать данные в мой API, но загрузка файла / несколько частей поставили меня в тупик.Я нахожу ресурсы для этого очень трудными для поиска и ограниченными, особенно из-за полной занятости в Android.
Я мог бы переключиться на Alamofire, но весь мой проект еще не использует его.Я хотел бы подождать, чтобы переключиться.Я легко потратил 5 часов, пытаясь комбинировать, чтобы даже показать малейшие переданные данные, но пока ничего.
Вот начало моего кода на Python:
if request.method == 'POST':
email = request.POST.get('email')
token = request.POST.get('token')
certnbr = request.POST.get('certnbr')
title = request.POST.get('title')
newCert = request.POST.get('newCert')
expires = request.POST.get('expires')
expirydate = request.POST.get('expiryDate')
issuedate = request.POST.get('issueDate')
picfile = request.FILES.get('image')
data = {}
#get the user
u = Usr.objects.get(email__iexact=email)
Некоторые источники мне не повезлос:
fluffy.es - «Этот код выглядит для меня таким неряшливым?»
средняя статья - «Я не смог найтиподсказка передачи параметров здесь "
stackoverflow
больше stackoverflow
далее stackoverlow
Что удивляет меня, так это несоответствие между всеми этими источниками, только некоторые даже используют uploadTask, плюс я прочитал дюжину других, которые, казалось, отличались.В конечном счете, Alamofire - лучший выбор?Почему бы Apple просто не принять это?Весь этот процесс на удивление сложен, заранее благодарю за любую помощь.
РЕДАКТИРОВАТЬ: я переключился на Alamofire, мгновенно проще.