Несколько типов кодирования для Alamofire Request

Мне нужно сделать POST запрос с HTTP Body с JSON объект, но мне также нужно использовать параметры запроса URL в том же запросе.

POST: http://www.example.com/api/create?param1=value&param2=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 более легко поддерживал несколько типов кодирования. Это похоже на обходной путь для меня.

Другие вопросы по тегам