在Swift中获取HTTP响应头

13

我正在遵循这个答案,在我的Swift项目中进行HTTP调用。 如何在Swift中发出HTTP请求?

以下是我使用的同步调用代码

let urlPath: String = "http://apiserver.com/api/login/?username=asdf&password=asdf"
            var url: NSURL = NSURL(string: urlPath)!
            var request1: NSURLRequest = NSURLRequest(URL: url)

            var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil

            var error: NSErrorPointer = nil
            var dataVal: NSData =  NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)!
            var err: NSError

            println("response -- \(response)")
            var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary

            println("Synchronous \(jsonResult)")

有人能帮我使用这段代码获取HTTP头响应或状态码吗?谢谢。

3个回答

20

试试这个:

 func getData(url: NSURL) {
    let config: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session: NSURLSession = NSURLSession(configuration: config)

    let dataTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {(data: NSData!, urlResponse: NSURLResponse!, error: NSError!) -> Void in

        if let httpUrlResponse = urlResponse as? NSHTTPURLResponse
        {
            if error {
                println("Error Occurred: \(error.localizedDescription)")
            } else {
                println("\(httpUrlResponse.allHeaderFields)") // Error
            }
        }
        })

       dataTask.resume()
    }

我已经尝试过了,但是出现了一个警告:“从AutoreleasingUnsafeMutablePointer<NSURLResponse?>转换为无关的类型NSHTTPURLResponse总是失败的”。 - Jabbar
我现在收到了这个响应:[Keep-Alive: timeout=5, max=100, Expires: Thu, 19 Nov 1981 08:52:00 GMT, Transfer-Encoding: Identity, Server: Apache/2.4.12 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4, Content-Type: text/html, Connection: Keep-Alive, Pragma: no-cache, Cache-Control: no-store, no-cache, must-revalidate, post-check=0, ........................................................没有状态码。 - Jabbar
如何通过键获取值? - Bhimbim

3

根据您在原问题中的代码,您尝试过这个吗?

let urlPath: String = "http://apiserver.com/api/login/?username=asdf&password=asdf"
var url: NSURL = NSURL(string: urlPath)!
var request1: NSURLRequest = NSURLRequest(URL: url)

var response: NSURLResponse? = nil

var error: NSError? = nil
var dataVal: NSData =  NSURLConnection.sendSynchronousRequest(request1, returningResponse: &response, error:&error)!
var err: NSError

println("response -- \(response)")
if let response = response as? NSHTTPURLResponse {
    if response.statusCode == 200 {
        print("Success")
    }
}
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary

println("Synchronous \(jsonResult)")

我尝试过这个,但成功时返回的statusCode = 200,但失败时返回nil...有什么建议吗? - Jabbar
我更新了答案,利用 sendSynchronousRequest(_:returningResponse:error:) 中的 error。在发送请求后设置断点以查看失败原因。例如,如果请求因密码错误而失败,则 error 中有信息可用于确定该问题。 - Matt Mathias

0

扩展以检索头字段

extension URLResponse {
    func headerField(forKey key: String) -> String? {
        (self as? HTTPURLResponse)?.allHeaderFields[key] as? String
    }
}

使用方法

var urlResponse: URLResponse = ...
let headerField = urlResponse.headerField(forKey: "retry-after")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接