2015-03-06 10 views
9

Ich muss eine POST Anfrage mit einem HTTP-Body mit einem JSON-Objekt machen, aber ich muss auch URL-Abfrage-Parameter in der gleichen Anfrage verwenden.Mehrere Codierungstypen für Alamofire Anforderung

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

Wird dies von Alamofire unterstützt? Wie würde ich das machen?

Antwort

7

Dies ist definitiv ein gültiger Anwendungsfall. Ich habe ähnliche Probleme beim Versuch, Zugriffstokens als Abfrageparameter an eine POST-Anforderung anzufügen, festgestellt. Hier ist eine Funktion, die die Dinge ein wenig einfacher machen sollte, ähnlich wie bei Ihrem Ansatz.

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 
} 

das gesagt ist, könnten Sie sicherstellen, dass auf den Github in einer Feature-Anfrage Frage stellen? Dies ist sicherlich etwas, das wir herausfinden müssen, wie man es in Alamofire einfacher machen kann, da es sich um einen so häufigen Anwendungsfall handelt. Wenn Sie eine wirklich gute Beschreibung Ihres Anwendungsfalls eingeben könnten, dann bin ich mir sicher, dass dies Aufmerksamkeit erregen wird. Ich werde sicherlich helfen, Presse zu bekommen, um Unterstützung zu bekommen.

+0

Dies ist ähnlich wie ich es unten tun. Danke @cnoon! Ich habe bereits ein Problem mit Alamofire angesprochen und @mattt hat erklärt, dass er nicht plant, dies zu unterstützen, und dass die Art und Weise, wie wir dies tun, der richtige Weg ist, dies zu erreichen. – AnthonyM

+0

Hey Kumpel, könntest du mich mit der Ausgabe # auf dem Alamofire Github-Projekt treffen, damit ich einen Blick darauf werfen kann? – cnoon

+1

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

1

An diesem Punkt habe ich beschlossen, dies zu lösen, indem Sie eine NSURLRequest mit den URL-Parametern manuell codieren, die URL aus dieser Anfrage abrufen und diese verwenden, um die endgültige Anfrage zu erstellen. Ich habe eine Funktion erstellt die Abfrageparameter codiert Anfrage zurück:

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

Dies funktioniert gut, aber ich würde auf jeden Fall Alamofire Unterstützung mehrerer Codierungstypen leichter sehen möchten. Das fühlt sich für mich wie ein Workaround an.

Verwandte Themen