Несколько типов кодирования для Alamofire Request
Мне нужно сделать POST
запрос с HTTP Body с JSON
объект, но мне также нужно использовать параметры запроса URL в том же запросе.
POST: http://www.example.com/api/create?param1=value¶m2=value
HTTP Body: { foo : [ bar, foo], bar: foo}
Поддерживается ли это Alamofire? Как бы я поступил так?
2 ответа
Это определенно допустимый вариант использования. Я столкнулся с похожими проблемами при попытке добавить токены доступа в качестве параметров запроса к запросу POST. Вот функция, которая на данный момент должна немного упростить ситуацию, которая похожа на ваш подход.
func multiEncodedURLRequest(
method: Alamofire.Method,
URLString: URLStringConvertible,
URLParameters: [String: AnyObject],
bodyParameters: [String: AnyObject]) -> NSURLRequest
{
let tempURLRequest = NSURLRequest(URL: NSURL(string: URLString.URLString)!)
let URLRequest = ParameterEncoding.URL.encode(tempURLRequest, parameters: URLParameters)
let bodyRequest = ParameterEncoding.JSON.encode(tempURLRequest, parameters: bodyParameters)
let compositeRequest = URLRequest.0.mutableCopy() as NSMutableURLRequest
compositeRequest.HTTPMethod = method.rawValue
compositeRequest.HTTPBody = bodyRequest.0.HTTPBody
return compositeRequest
}
С учетом вышесказанного, не могли бы вы поставить проблему с запросом на Github? Это, безусловно, то, что нам нужно выяснить, как сделать проще в Alamofire, так как это такой распространенный случай использования. Если бы вы могли дать действительно хорошее описание вашего варианта использования, то я уверен, что оно привлечет внимание. Я обязательно помогу прессе, чтобы получить поддержку добавлена.
На данный момент, я решил решить эту проблему, вручную кодируя NSURLRequest
с параметрами URL, получая URL из этого запроса и используя его для создания окончательного запроса. Я создал функцию для возврата закодированного запроса параметра запроса:
private func queryParameterEncodedRequestURL(urlString: String,
values: [String]) -> NSURL {
let URL = NSURL(string: urlString)
var request = NSURLRequest(URL: URL)
let parameters = [
"param1": values[0]!,
"param2": values[1]!
]
let encoding = Alamofire.ParameterEncoding.URL
(request, _) = encoding.encode(request, parameters: parameters)
return (request.URL, nil)
}
Это прекрасно работает, но я бы определенно хотел, чтобы Alamofire более легко поддерживал несколько типов кодирования. Это похоже на обходной путь для меня.