Swift: 在HTTP请求头中传递参数

16

我需要发送一个HTTP请求,虽然我知道如何做到这一点,但是我的Backendless API要求在HTTP请求头中包含应用程序ID和密钥。您能帮忙告诉我如何将其添加到我的代码中吗?谢谢。

let urlString = "https://api.backendless.com/v1/data/Pub"
    let session = NSURLSession.sharedSession()
    let url = NSURL(string: urlString)!

    session.dataTaskWithURL(url){(data: NSData?,response: NSURLResponse?, error: NSError?) -> Void in

        if let responseData = data
        {
            do{
                let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments)
                print(json)
            }catch{
                print("Could not serialize")
            }
        }

    }.resume()
3个回答

40

Swift 5+,4.1+和Swift 3

var request = URLRequest(url: url)
request.setValue("secret-keyValue", forHTTPHeaderField: "secret-key")

URLSession.shared.dataTask(with: request) { data, response, error in }

Swift 2.2

使用以下方式将您的NSURL包装到NSMutableRequest中:

let request = NSMutableURLRequest(URL: url)

然后使用这种方法将标题添加到您的request对象中:

request.setValue("secret-keyValue", forHTTPHeaderField: "secret-key")

使用dataTaskWithRequest:方法代替dataTaskWithURL:

session.dataTaskWithRequest(request){
(data: NSData?,response: NSURLResponse?, error: NSError?) -> Void in }

1
请检查更新后的答案。请注意,不应使用setValue:forKey:设置HTTP标头,因为它可能无法将标头添加到HTTP正文中。 - Said Sikira

4
我做了这件事。
let urlString = "https://api.backendless.com/v1/data/Pub"
        let session = NSURLSession.sharedSession()
        let url = NSURL(string: urlString)!
        let request = NSMutableURLRequest(URL: url)

        request.setValue("application-idValue", forKey: "application-id")
        request.setValue("secret-keyValue", forKey: "secret-key")

        session.dataTaskWithRequest(request){(data: NSData?,response: NSURLResponse?, error: NSError?) -> Void in

            if let responseData = data
            {
                do{
                    let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments)
                    print(json)
                }catch{
                    print("Could not serialize")
                }
            }

        }.resume()
    }

谢谢回答!您(或编辑这个答案的人)是否能够添加一个说明,说明这是哪个版本的Swift? - Keara

1
 //MARK: GET Method
func GETDataFromServerUsingHeaderParameters(nameOfApi : NSString, parameters : NSString, withCurrentTask: RequestType, andDelegate : AnyObject) -> Void {
    if (currentReachabilityStatus != .notReachable){
        //print("Internet Connection Available!")
        currentTask = withCurrentTask
        let respectedURL = NSString(format: "%@%@", GlobalConstants.KBase_Url,nameOfApi,parameters)
        let myRequestUrl = (respectedURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed))!
        let url = NSURL(string: myRequestUrl as String)!
        let request = NSMutableURLRequest(url: url as URL)
        request.setValue("application-idValue", forKey: "application-id")
        request.setValue("secret-keyValue", forKey: "secret-key")
        request.httpMethod = "GET"
            let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in
            guard let data = data, error == nil else {
                self.showAlertMessage(title: "App Name", message: "Server not responding, please try later")
                self.delegate?.internetConnectionFailedIssue()
                return
            }
            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                self.delegate?.internetConnectionFailedIssue()
            }else{
                do {
                    self.responseDictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! NSDictionary
                    self.delegate?.responseReceived()
                } catch {
                }
            }
        }
        task.resume()
    }else{
        self.showAlertMessage(title: "App Name", message: "No Internet Connection..")
    }
}

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