2015-03-06 4 views
9

Devo effettuare una richiesta POST con un corpo HTTP con un oggetto JSON, ma ho anche bisogno di utilizzare i parametri di query url nella stessa richiesta.Tipi di codifica multipli per richiesta Alamofire

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

È supportato da Alamofire? Come potrei fare questo?

risposta

7

Questo è sicuramente un caso d'uso valido. Ho riscontrato problemi simili con il tentativo di aggiungere i token di accesso come parametri di query a una richiesta POST. Ecco una funzione che dovrebbe rendere le cose un po 'più semplici per il momento che è simile al tuo approccio.

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 
} 

Detto questo, si potrebbe fare in modo di mettere in un problema di richiesta di funzionalità sul Github? Questo è certamente qualcosa che dobbiamo capire come rendere più facile in Alamofire dal momento che è un caso di uso comune. Se tu potessi inserire una descrizione molto buona del tuo caso d'uso, allora sono sicuro che otterrà attenzione. Sicuramente aiuterò la stampa per ottenere il supporto aggiunto.

+0

Questo è simile al modo in cui lo faccio di seguito. Grazie @ pomeriggio! Ho già inserito un problema su Alamofire e @mattt ha dichiarato che non ha intenzione di supportarlo e che il modo in cui lo facciamo è il modo corretto per farlo accadere. – AnthonyM

+0

Ehi amico, potresti parlarmi del numero # del progetto Alamofire Github in modo che possa dare un'occhiata? – cnoon

+1

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

1

A questo punto, ho deciso di risolvere questo problema codificando manualmente un NSURLRequest con i parametri URL, recuperando l'URL da quella richiesta e utilizzando quello per creare la richiesta finale. Ho creato una funzione per restituire il parametro di query di richiesta codificata:

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) 
} 

Questo funziona bene, ma avrei sicuramente piacerebbe vedere supporto Alamofire più tipi di codifica più facilmente. Questo mi sembra una soluzione.