#arrays #swift #alamofire #urlsession
Вопрос:
Обычно мы используем словари в качестве параметров, но для удаления API фотографий, с которым я работаю, требуется просто имя строки этого изображения в массиве.
Content-Type: application/json; charset=UTF-8 Content-Length: 80 Authorization: Bearer [token] ["https://work-solution.s3.eu-north-1.amazonaws.com/job-83-image-gpfv7dfy.jpeg"]
У меня есть метод добавления одной строки в httpBody с помощью Alamofire:
struct BodyStringEncoding: ParameterEncoding { private let body: String init(body: String) { self.body = body } func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -gt; URLRequest { guard var urlRequest = urlRequest.urlRequest else { throw Errors.emptyURLRequest } guard let data = body.data(using: .utf8) else { throw Errors.encodingProblem } urlRequest.httpBody = data return urlRequest } }
И это нормально, но я не знаю, как сделать это тело массивом с одной строкой, а не просто строкой.
Ответ №1:
Вы можете сделать:
let bodyData = try? JSONSerialization.data(withJSONObject: yourArray)
с последующим
let bodyString = String(data: body, encoding: .utf8)
Есть разворачивание, и нужно/успеть написать, но вы поняли идею.
Эту строку guard let data = body.data(using: .utf8) else { throw Errors.encodingProblem }
можно упростить let data = Data(body.utf8)
, не нужно разворачивать.
Наконец, поскольку вы делаете
Array -- JSONSerialization.data(withJSONObject: theArray) --gt; Data -- String(data: theData, encoding: .utf8) --gt; String -- Data(theString.utf8) --gt; Data
Возможно, вам захочется переписать свой объект, избегая ненужных преобразований:
struct BodyStringEncoding: ParameterEncoding { private let body: Data init(body: String) { self.body = Data(body.utf8) } init(body: Data) { self.body = body } func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -gt; URLRequest { guard var urlRequest = urlRequest.urlRequest else { throw Errors.emptyURLRequest } urlRequest.httpBody = self.body return urlRequest } }