#ios #swift #api #rest #webapi
#iOS #swift #API #rest #webapi
Вопрос:
Я использую post-запрос API для получения измененного изображения.
curl
-F 'image=@/path/to/your/file.jpg'
-H 'api-key:[myKey]'
[api url]
Он отлично работал непосредственно на терминале моего Mac, используя:
curl
-F 'image=@/Users/user/image.jpg'
-H 'api-key:[myKey]'
[api url]
Пытаясь использовать его в приложении для iOS, я изо всех сил пытаюсь получить путь к изображению.
API работает с Alamofire, используя другой параметр, который использует URL-адрес изображения. Поэтому я подумал загрузить изображение на сервер и использовать этот URL-адрес, но было бы намного лучше, если бы я мог напрямую использовать параметр path.
Это то, что я пробовал, но это не работает.
func imagePath(_ image: UIImage, handler: @escaping (String?) -> Void ) {
let path = NSTemporaryDirectory()
.appending(UUID().uuidString)
.appending("png")
let url = URL(fileURLWithPath: path)
let data = image.pngData()
let urlForApi = "@" path
do {
try data?.write(to: url)
// Just to check if write above works, it always works fine
let postData = try UIImage(data: Data(contentsOf: url))
handler (urlForApi)
} catch {
handler (nil)
}
}
Он возвращает обработчик (urlForApi), но запрос выдает ошибку. Я не получаю правильный путь для запроса.
Комментарии:
1. Прежде всего
let urlForApi = "@" path
<— это не требуется, обозначение «@» является синтаксисом, специфичным для CURL. Во-вторых:/Users/user/
абсолютный путь сильно отличается отNSTemporaryDirectory()
Ответ №1:
Я мог бы решить эту проблему, используя запрос на загрузку Alamofire.
func getPostURL(`fromImage` preImage: UIImage?, postImageURL: @escaping (_ outputImageURL: String) -> (), error: @escaping (_ error: Error?) -> ()) {
if let safeImage = preImage {
let data = safeImage.pngData()!
AF.upload(multipartFormData: { (form) in
form.append(data, withName: "image", fileName: "image.png", mimeType: "image/png")
}, to: apiURL!, headers: headers).validate(statusCode: okStatusCodes).responseDecodable(of: ImageResponse.self) {
response in
if let url = response.value?.output_url {
postImageURL(url)
} else {
error(response.error)
}
}
} else {
error(ImageDataError.gettingPostURL)
}
}
Однако было бы интересно узнать, как получить временные пути к файлам.