2015-02-06 15 views
6

Próbuję wykonać żądanie GET z Alamofire w Swift. Muszę ustawić następujące nagłówki:Alamofire Accept and Content-Type JSON

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

mogę włamać się wokół niego i zrobić to bezpośrednio z wyszczególnieniem nagłówki żądania, ale chcę to zrobić z ParameterEncoding, jak sugeruje się w bibliotece. Do tej pory mam to:

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 jest ustawiony, ale nie Accept. Jak mogę to zrobić właściwie?

+1

Najlepszym rozwiązaniem, jakie mogę teraz wymyślić, jest dodanie go do "defa" Właściwość ultHeaders '' AlamoFire.Manager' –

+0

@David Jak by to było dokładnie? Próbowałem 'Alamofire.Manager.defaultHTTPHeaders(). UpdateValue (wartość:" application/json ", forKey:" Accept ")' bez powodzenia – jlhonora

+1

Będziesz musiał to zmienić w 'manager.session.configuration. Właściwość HTTPAdditionalHeaders. Zmiana tego spowoduje, że zmiana będzie dotyczyć wszystkich kolejnych wniosków. Inną możliwością jest dodanie 'Request' wzorowanego na' validate', które pozwoliło mi ustawić nagłówek w locie. W ten sposób możesz zmienić to dla pojedynczego żądania. –

Odpowiedz

10

skończyło się używając 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 
    } 
} 

a potem po prostu:

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

Innym sposobem na to jest, aby określić ją dla całej sesji, sprawdź @ komentarzem Davida powyżej:

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

To jest jeszcze lepsze podejście niż mój komentarz powyżej. –

+0

Odpowiedź routera zgłasza teraz 2 błędy w Swift 2. Na 'enum Router:' otrzymujemy 'Type 'Router' nie jest zgodny z protokołem 'URLRequestConvertible'' i' returnRequest.0' otrzymujemy 'Value of type' NSMutableURLRequest "nie ma członka" 0 ". –

+0

@ Craig.Pearce good one, zmieniono na 'NSMutableURLRequest'. Nie jestem w stanie przetestować go teraz, więc daj mi znać, jeśli nadal jest uszkodzony – jlhonora

1

Przykład bezpośrednio ze strony 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) 
     } 

W twoim przypadku dodać co chcesz:

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

Nie, to daje mi 'Zaakceptuj: */*'. Potrzebuję go konkretnie 'application/json' – jlhonora

+2

' .validate (Accept: ["application/json"]) 'nie działa, XCode pokazuje następujący błąd:' Niepoprawna etykieta argumentu w wywołaniu (mają 'Accept: ', expected' contentType: ') ' – jlhonora

1

Spróbuj:

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

prosty sposób korzystać dostać sposób z zapytaniem mapa i typ odpowiedzi 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):  
       }