2015-02-06 79 views
6

我试图在斯威夫特与Alamofire GET请求。我需要设置以下标题:Alamofire接受和内容类型的JSON

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

我可以砍它周围并做到这一点直接指定的标头的要求,但我想与ParameterEncoding做到这一点,因为在图书馆建议。到目前为止,我有这样的:

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设置,但不Accept。我怎样才能正确地做到这一点?直接从Alamofire GitHub的页面

+1

我现在想出的最好方法是将它添加到'defa 'AlamoFire.Manager'的ultHeaders'属性 – 2015-02-06 21:22:54

+0

@David这将如何去准确?我尝试了'Alamofire.Manager.defaultHTTPHeaders()。updateValue(value:“application/json”,forKey:“Accept”)'没有运气 – jlhonora 2015-02-06 21:31:24

+1

你实际上需要在'manager.session.configuration中改变它。 HTTPAdditionalHeaders属性。在此处更改将使更改适用于所有后续请求。另一种可能性是在'validate'上添加一个'Request',它允许我随时设置一个头文件。这样你可以改变它的单个请求。 – 2015-02-06 21:51:23

回答

10

我结束了使用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 
    } 
} 

然后就是:

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

另一种方式来做到这一点是指定它为整个会话,查看@以上大卫的评论:

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

这是比我上面评论更好的方法。 – 2015-02-06 21:53:54

+0

路由器的回答现在在Swift 2中抛出2个错误。在'enum Router:'我们得到'Type'Router'不符合协议'URLRequestConvertible''并且返回URLRequest.0'我们得到'Value of type' NSMutableURLRequest'没有member'0'。 – 2016-01-30 16:29:12

+0

@ Craig.Pearce不错,更改为'NSMutableURLRequest'。我现在无法测试它,所以让我知道它是否仍然存在 – jlhonora 2016-02-01 16:19:07

1

例子:

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

你的情况,添加你想要什么:

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

不,这给了我'接受:*/*'。我需要它具体'应用程序/ json' – jlhonora 2015-02-06 20:55:32

+2

'.validate(接受:[“应用程序/ json”])也不工作,XCode显示以下错误:'调用中的不正确参数标签(有'接受: ',expected'contentType:')' – jlhonora 2015-02-06 21:08:34

1

试试这个:

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

简单的方式使用get方法与查询地图和响应类型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):  
       } 
相关问题