2015-02-06 6 views
6

Sto cercando di fare una richiesta GET con Alamofire in Swift. Ho bisogno di impostare le seguenti intestazioni:Alamofire Accept e Content-Type JSON

Content-Type: application/json 
Accept: application/json 

ho potuto hack in giro e farlo specificando direttamente le intestazioni per la richiesta, ma voglio farlo con ParameterEncoding, come suggerito nella biblioteca. Finora ho questo:

Alamofire.request(.GET, url, encoding: .JSON) 
    .validate() 
    .responseJSON { (req, res, json, error) in 
     if (error != nil) { 
      NSLog("Error: \(error)") 
      println(req) 
      println(res) 
     } else { 
      NSLog("Success: \(url)") 
      var json = JSON(json!) 
     } 
} 

Content-Type è impostato, ma non Accept. Come posso farlo correttamente?

+1

L'approccio migliore che riesco a fare adesso è quello di aggiungerlo al proprietà ultHeaders' di 'AlamoFire.Manager' –

+0

@David Come sarebbe esattamente? Ho provato 'Alamofire.Manager.defaultHTTPHeaders(). UpdateValue (valore:" application/json ", forKey:" Accept ")' senza fortuna – jlhonora

+1

In realtà è necessario cambiarlo in 'manager.session.configuration. Proprietà HTTPAdditionalHeaders'. Se lo si modifica, la modifica verrà applicata a tutte le richieste successive. Un'altra possibilità è quella di aggiungere una 'Request' modellata su' validate' che mi ha permesso di impostare un header al volo. In questo modo è possibile cambiarlo per una singola richiesta. –

risposta

10

ho finito per usare URLRequestConvertiblehttps://github.com/Alamofire/Alamofire#urlrequestconvertible

enum Router: URLRequestConvertible { 
    static let baseUrlString = "someUrl" 

    case Get(url: String) 

    var URLRequest: NSMutableURLRequest { 
     let path: String = { 
      switch self { 
      case .Get(let url): 
       return "/\(url)" 
      } 
     }() 

     let URL = NSURL(string: Router.baseUrlString)! 
     let URLRequest = NSMutableURLRequest(URL: 
          URL.URLByAppendingPathComponent(path)) 

     // set header fields 
     URLRequest.setValue("application/json", 
          forHTTPHeaderField: "Content-Type") 
     URLRequest.setValue("application/json", 
          forHTTPHeaderField: "Accept") 

     return URLRequest.0 
    } 
} 

E poi basta:

Alamofire.request(Router.Get(url: "")) 
    .validate() 
    .responseJSON { (req, res, json, error) in 
     if (error != nil) { 
      NSLog("Error: \(error)") 
      println(req) 
      println(res) 
     } else { 
      NSLog("Success") 
      var json = JSON(json!) 
      NSLog("\(json)") 
     } 
} 

Un altro modo per farlo è quello di specificare che per l'intera sessione, controllare @ il commento di David sopra:

Alamofire.Manager.sharedInstance.session.configuration 
     .HTTPAdditionalHeaders?.updateValue("application/json", 
              forKey: "Accept") 
+0

Questo è un approccio ancora migliore rispetto al mio commento sopra. –

+0

La risposta del router genera ora 2 errori in Swift 2. Sul 'enum Router:' otteniamo 'Type 'Router' non conforme al protocollo 'URLRequestConvertible'' e su' return URLRequest.0' otteniamo 'Value of type' NSMutableURLRequest 'non ha membri'0''. –

+0

@ Craig.Pearce buono, cambiato in 'NSMutableURLRequest'. Non sono in grado di testarlo adesso, quindi fammi sapere se è ancora rotto – jlhonora

1

Esempio direttamente dalla pagina GitHub Alamofire:

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) 
     .validate(statusCode: 200..<300) 
     .validate(contentType: ["application/json"]) 
     .response { (_, _, _, error) in 
        println(error) 
     } 

Nel tuo caso aggiungere ciò che si vuole:

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) 
     .validate(statusCode: 200..<300) 
     .validate(contentType: ["application/json"]) 
     .validate(Accept: ["application/json"]) 
     .response { (_, _, _, error) in 
        println(error) 
     } 
+1

No, che mi dà "Accetta: */*". Ho bisogno che sia specificamente 'application/json' – jlhonora

+2

' .validate (Accept: ["application/json"]) 'non funziona neanche, XCode mostra il seguente errore:' Etichetta argomento errata nella chiamata (avere 'Accept: ', expected' contentType: ') ' – jlhonora

1

Prova questo:

URLRequest.setValue("application/json", 
        forHTTPHeaderField: "Content-Type") 
URLRequest.setValue("application/json", 
        forHTTPHeaderField: "Accept") 
0

modo semplice da usare ottenere il metodo con interrogazione mappa e tipo di risposta json

var parameters: [String:Any] = [ 
      "id": "3" 
     ] 
var headers: HTTPHeaders = [ 
      "Content-Type":"application/json", 
      "Accept": "application/json" 
     ] 
Alamofire.request(url, method: .get, 
parameters: parameters, 
encoding: URLEncoding.queryString,headers:headers) 
.validate(statusCode: 200..<300) 
      .responseData { response in  
       switch response.result { 
       case .success(let value): 
       case .failure(let error):  
       }