2015-03-06 2 views
9

Мне нужно сделать запрос с телом HTTP с объектом JSON, но мне также необходимо использовать параметры запроса url в том же запросе.Несколько типов кодирования для запроса Alamofire

POST: http://www.example.com/api/create?param1=value&param2=value 
HTTP Body: { foo : [ bar, foo], bar: foo} 

Поддерживается ли это Alamofire? Как мне это сделать?

ответ

7

Это, безусловно, действительный прецедент. Я столкнулся с подобными проблемами, пытаясь добавить токены доступа в качестве параметров запроса к запросу 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, поскольку это такой распространенный вариант использования. Если бы вы могли составить действительно хорошее описание вашего варианта использования, то я уверен, что он привлечет внимание. Я обязательно помогу, чтобы добавить поддержку.

+0

Это похоже на то, как я делаю это ниже. Спасибо @cnoon! Я уже задал вопрос о Alamofire, и @mattt заявил, что он не планирует поддерживать это, и что способ, которым мы это делаем, - это правильный способ сделать это. – AnthonyM

+0

Эй, чувак, не могли бы вы наткнуться на проблему № в проекте Alamofire Github, чтобы я мог посмотреть? – cnoon

+1

# 374 https://github.com/Alamofire/Alamofire/issues/374 – AnthonyM

1

На этом этапе я решил решить эту проблему, вручную кодируя 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 нескольких типов кодирования. Мне кажется, что это обходное решение.

Смежные вопросы