【问题标题】:HTTP Headers w/ NSURLRequest in swiftswift中带有NSURLRequest的HTTP标头
【发布时间】:2016-05-16 01:53:44
【问题描述】:

有人知道如何在 Swift 中使用 NSURLRequest 配置 HTTP 标头吗?我在我的服务器上设置了身份验证,它只需要传递给它的令牌,但我在设置标头时遇到问题

我的代码:

func getLatestData() {
        var loggedInUsersNumber:String = SharingManager.sharedInstance.userID
        var usersDataPoint:String = StormDataPoint + loggedInUsersNumber
        activityIND.hidden = false
        activityIND.startAnimating()
        let request = NSURLRequest(URL: NSURL(string: usersDataPoint)!)
        let tokenString = SharingManager.sharedInstance.authToken
        //request.setValue("Token " + tokenString, forKey: "Authorization")
        let urlSession = NSURLSession.sharedSession()
        let task = urlSession.dataTaskWithRequest(request, completionHandler: {
            (data, response, error) -> Void in
            if let error = error {
                print(error)
                return }

我创建了一个属性“tokenString”作为令牌传递到标题中,并在下一行我将其注释掉。 request.setvalue - 我将其弹出并收到“无法覆盖数据类型”的错误。我所有的搜索都显示了 Objective C 的帮助。有没有更好的方法来尝试传递标头?

【问题讨论】:

    标签: swift rest http swift2


    【解决方案1】:

    在 Swift 3 中,使用 URLRequest structure 代替 NSURLRequest(类似地,NSURLURLNSURLSessionURLSession 等)。

    然后使用addValue(_:for<b>HTTPHeaderField</b>:)添加标题。

    // swift 3:
    var request = URLRequest(url: URL(string: usersDataPoint)!)
    request.addValue("Token \(tokenString)", forHTTPHeaderField: "Authorization")
    

    在 Swift 2.2 中,如果需要修改,请使用 NS<b>Mutable</b>URLRequest

    // swift 2:
    let request = NSMutableURLRequest(URL: NSURL(string: usersDataPoint)!)
    request.addValue("Token \(tokenString)", forHTTPHeaderField: "Authorization")
    

    【讨论】:

    • Apple's docs 警告不应使用这些方法设置 Authorization 字段。对吗?
    【解决方案2】:

    您可以创建可变 URL 请求,然后为字段名称设置值。

    let request = NSMutableURLRequest(URL: NSURL(string: yourURLString)!)
    request.setValue("\(yourValue)", forHTTPHeaderField: "Header-field-name")
    

    【讨论】:

      【解决方案3】:

      Swift3 更大的例子

      var req: URLRequest = /* create requets */
      req.setValue("Bearer Y3GzLG2x6wSXihmUGhwGFw", forHTTPHeaderField: "Authorization")
      req.timeoutInterval = 10
      let task = URLSession.shared.dataTask(with: req, completionHandler: { (data, response, error) in
          print("completionHandler invoked")
      })
      task.resume()
      

      【讨论】:

        【解决方案4】:
                private func getHeaderData(url:String) -> Dictionary<String, String> {
                  let strLanguage:String =  LanguageManager.sharedInstance.getCurrentLanuage()
        
                        let params:[String:String] = [WSKeys.XAPIkey: XAPIKeyString,
                                                      WSKeys.language:strLanguage
                        ]
                        return params
        
                }
        
                class NetworkManager: NSObject {
        
                    static let shared = NetworkManager()
        
                    //MARK: - WS CALLS Methods
                    func GETRequset(showLoader: Bool, url:String, success:@escaping (AnyObject!) -> Void, failed:@escaping (AnyObject!) -> Void) {
        
                        self.startProgressLoading(isStart: showLoader)
                        var request = URLRequest(url: URL(string: url)!)
                        request.httpMethod = "GET"
                        request.allHTTPHeaderFields = getHeaderData(url: url)
        
        
        
                        let task = URLSession.shared.dataTask(with: request) { data, response, error in
        
                            guard let data = data, error == nil else {
                                print("O/P error=\(error.debugDescription)")
                                self.stopProgressLoading()
                                failed(error.debugDescription as AnyObject!)
                                return
                            }
        
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
        
                                self.stopProgressLoading()
                                failed(response as AnyObject!)
                            }
        
                            let responseString = String(data: data, encoding: .utf8)
        
        
                            self.stopProgressLoading()
                            DispatchQueue.main.async {
                                success(responseString as AnyObject!)
                            }
        
                        }
                        task.resume()
                    }
        
                    func POSTRequset(showLoader: Bool, url:String, parameter:[String : AnyObject]?, success:@escaping (AnyObject!) -> Void, failed:@escaping (AnyObject!) -> Void) {
        
                        self.startProgressLoading(isStart: showLoader)
        
                        let boundary = "Boundary-\(NSUUID().uuidString)"
                        let url = URL(string: url)
        
                        let request = NSMutableURLRequest(url: url!)
                        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
                        request.httpMethod = "POST"
                        let headerData = getHeaderData(url: (url?.absoluteString)!)
                        request.allHTTPHeaderFields = headerData
        
                        var body = Data()
                        if parameter != nil {
        
                            for (key, value) in parameter! {
        
                                body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
                                body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
                                body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
                            }
                        }
        
                        body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
                        request.httpBody = body
        
        
                        let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
                            data, response, error in
                            print("##############################################################################")
        
        
                            guard let data = data, error == nil else {
                                failed(error.debugDescription as AnyObject!)
                                self.stopProgressLoading()
                                return
                            }
        
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
        
                                self.stopProgressLoading()
                                failed(response as AnyObject!)
                            }
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 401 {
        
                                self.stopProgressLoading()
        
                                failed(response as AnyObject!)
                            }
        
                            let responseString = String(data: data, encoding: .utf8)
                            let dict = self.convertToDictionary(text: responseString!)
        
                            if dict != nil
                            {
                                print("O/P responseDict = \(String(describing: dict))")
                            }
                            else
                            {
                                print("O/P responseString = \(String(describing: responseString))")
                            }
        
        
                            print("##############################################################################")
        
                            if (dict?["status"]) != nil {
                                let strStatus = dict?[WSKeys.status] as! NSNumber
                                let strMessage = dict?[WSKeys.message] as! NSString
                                self.stopProgressLoading()
                                if strStatus == 401{
                                    failed(strMessage)
                                    DispatchQueue.main.async {
                                        getDelegate().logOut()
                                    }
                                } else {
                                    DispatchQueue.main.async {
                                        success(dict as AnyObject!)
                                    }
                                }
                            }
        
        
        
                        })
                        task.resume()
                    }
        
                    func POSTJsonArrayRequset(showLoader: Bool, url:String, parameter:[String : AnyObject]?, success:@escaping (AnyObject!) -> Void, failed:@escaping (AnyObject!) -> Void) {
        
        
        
                        self.startProgressLoading(isStart: showLoader)
        
        
                        let request = NSMutableURLRequest(url: URL(string:url)!)
                        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                        request.httpBody = try! JSONSerialization.data(withJSONObject: parameter)
                        request.httpMethod = "POST"
        
                        let headerData = getHeaderData(url: url)
                        request.allHTTPHeaderFields = headerData
        
        
                        let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
                            data, response, error in
                            print("##############################################################################")
                            print("URL: \(String(describing: url))")
                            print("PARAMS: \(String(describing: parameter))")
                            print("Headers: \(headerData)")
                            print("Method: Post")
        
                            guard let data = data, error == nil else {
                                print("O/P error=\(error.debugDescription)")
                                failed(error.debugDescription as AnyObject!)
                                self.stopProgressLoading()
                                return
                            }
        
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                                print("O/P statusCode should be 200, but is \(httpStatus.statusCode)")
                                //                print("O/P response = \(String(describing: response))")
                                self.stopProgressLoading()
                                failed(response as AnyObject!)
                            }
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 401 {
                                print("O/P statusCode should be 401, but is \(httpStatus.statusCode)")
                                //                print("O/P response = \(String(describing: response))")
                                self.stopProgressLoading()
        
                                failed(response as AnyObject!)
                            }
        
                            let responseString = String(data: data, encoding: .utf8)
                            let dict = self.convertToDictionary(text: responseString!)
        
                            if dict != nil
                            {
                                print("O/P responseDict = \(String(describing: dict))")
                            }
                            else
                            {
                                print("O/P responseString = \(String(describing: responseString))")
                            }
        
        
                            print("##############################################################################")
        
        
                            let strStatus = dict?[WSKeys.status] as! NSNumber
                            let strMessage = dict?[WSKeys.message] as! NSString
                            self.stopProgressLoading()
                            if strStatus == 401{
                                failed(strMessage)
                                DispatchQueue.main.async {
                                    getDelegate().logOut()
                                }
                            } else {
                                DispatchQueue.main.async {
                                    success(dict as AnyObject!)
                                }
                            }
                        })
                        task.resume()
        
        
                    }
        
                    func POSTJsonArrayRequsetTap(showLoader: Bool, url:String, parameter:[String : AnyObject]?, success:@escaping (AnyObject!) -> Void, failed:@escaping (AnyObject!) -> Void) {
        
        
        
                        self.startProgressLoading(isStart: showLoader)
        
        
                        let request = NSMutableURLRequest(url: URL(string:url)!)
                        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                        request.httpBody = try! JSONSerialization.data(withJSONObject: parameter)
                        request.httpMethod = "POST"
        
                        let headerData = ["content-type": "application/json"]
                        request.allHTTPHeaderFields = headerData
        
        
                        let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
                            data, response, error in
                            print("##############################################################################")
                            print("URL: \(String(describing: url))")
                            print("PARAMS: \(String(describing: parameter))")
                            print("Headers: \(headerData)")
                            print("Method: Post")
        
                            guard let data = data, error == nil else {
                                print("O/P error=\(error.debugDescription)")
                                failed(error.debugDescription as AnyObject!)
                                self.stopProgressLoading()
                                return
                            }
        
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                                print("O/P statusCode should be 200, but is \(httpStatus.statusCode)")
                                //                print("O/P response = \(String(describing: response))")
                                self.stopProgressLoading()
                                failed(response as AnyObject!)
                            }
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 401 {
                                print("O/P statusCode should be 401, but is \(httpStatus.statusCode)")
                                //                print("O/P response = \(String(describing: response))")
                                self.stopProgressLoading()
        
                                failed(response as AnyObject!)
                            }
        
                            let responseString = String(data: data, encoding: .utf8)
                            let dict = self.convertToDictionary(text: responseString!)
        
                            if dict != nil
                            {
                                print("O/P responseDict = \(String(describing: dict))")
                            }
                            else
                            {
                                print("O/P responseString = \(String(describing: responseString))")
                            }
        
        
                            print("##############################################################################")
        
        
                            let strStatus = dict?[WSKeys.status] as! NSNumber
                            let strMessage = dict?[WSKeys.message] as! NSString
                            self.stopProgressLoading()
                            if strStatus == 401{
                                failed(strMessage)
                                DispatchQueue.main.async {
                                    getDelegate().logOut()
                                }
                            } else {
                                DispatchQueue.main.async {
                                    success(dict as AnyObject!)
                                }
                            }
                        })
                        task.resume()
        
        
                    }
        
                    func convertToDictionary(text: String) -> [String: Any]? {
                        if let data = text.data(using: .utf8) {
                            do {
                                return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                            } catch {
                                print(error.localizedDescription)
                            }
                        }
                        return nil
                    }
        
        
                    func MultipartFormDataRequset(showLoader: Bool, urlString:String, mediaKey:String?, mediaDataArray:[Dictionary<String, AnyObject>]?, parameter:[String : AnyObject]?, success:@escaping (AnyObject!) -> Void, failed:@escaping (AnyObject!) -> Void) {
        
                        let boundary = "Boundary-\(NSUUID().uuidString)"
        
                        let url = URL(string: urlString)
                        let request = NSMutableURLRequest(url: url!)
        
                        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
                        request.httpMethod = "POST"
                        request.allHTTPHeaderFields = getHeaderData(url: urlString) 
        
                        var body = Data()
        
                        if parameter != nil {
        
                            for (key, value) in parameter! {
        
                                body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
                                body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
                                body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
                            }
                        }
        
        
                        if mediaDataArray != nil {
        
                            var i = 0
        
                            for var dict in mediaDataArray! {
        
                                let data = dict["data"]
                                let mimetype = "application/octet-stream"
        
                                body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
        
                                let key = "\(String(describing: mediaKey))[\(i)]"
                                body.append("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(dict["fileName"]!)\"\r\n".data(using: String.Encoding.utf8)!)
                                body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
                                body.append(data! as! Data)
                                body.append("\r\n".data(using: String.Encoding.utf8)!)
        
                                i = i + 1
                            }
                        }
        
        
                        body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
                        request.httpBody = body
        
        
                        let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
                            data, response, error in
        
                            guard let data = data, error == nil else {
                                print("O/P error=\(error.debugDescription)")
                                failed(error.debugDescription as AnyObject!)
                                self.stopProgressLoading()
                                return
                            }
        
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                                print("O/P statusCode should be 200, but is \(httpStatus.statusCode)")
                                print("O/P response = \(String(describing: response))")
                                self.stopProgressLoading()
                                failed(response as AnyObject!)
                            }
        
                            let responseString = String(data: data, encoding: .utf8)
                            print("O/P responseString = \(String(describing: responseString))")
                            self.stopProgressLoading()
        
                            DispatchQueue.main.async {
                                success(responseString as AnyObject!)
                            }
        
                        })
        
                        task.resume()
                    }
        
                    func MultipartFormDataForSingleMediaRequset(showLoader: Bool, url:String, mediaData:Data?, mediaKey:String?, parameter:[String : AnyObject]?, success:@escaping (AnyObject!) -> Void, failed:@escaping (AnyObject!) -> Void) {
        
                        let startBoundry:String = "AaB03x"
                        let url = URL(string: url)!
                        var request:URLRequest = URLRequest(url: url as URL, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 10)
                        request.allHTTPHeaderFields = getHeaderData(url: url.absoluteString) 
        
                        let boundary:String = "--\(startBoundry)"
                        let endMPboundary:String = "\(boundary)--"
        
                        let imageData:Data = mediaData!
                        var body:String = String()
        
                        if parameter != nil {
                            for (key, value) in parameter! {
        
                                body = body + "\(boundary)\r\n"
                                body = body + "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n"
                                body = body + "\(value)\r\n"
                            }
                        }
        
                        body = body + "\(boundary)\r\n"
                        body = body + "Content-Disposition: form-data; name=\"\(mediaKey!)\"; filename=\"\("attachment.png")\"\r\n"
                        body = body + "Content-Type: image/png\r\n\r\n"
        
                        let end:String = "\r\n\(endMPboundary)"
                        var myRequestData:Data = Data();
                        myRequestData.append(body.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!)
                        myRequestData.append(imageData as Data)
                        myRequestData.append(end.data(using: String.Encoding.utf8)!)
                        let content:String = "multipart/form-data; boundary=\(startBoundry)"
                        request.setValue(content, forHTTPHeaderField: "Content-Type")
                        request.setValue("\(myRequestData.count)", forHTTPHeaderField: "Content-Length")
                        request.httpBody = myRequestData as Data
                        request.httpMethod = "POST"
        
        
                        let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
                            data, response, error in
        
                            guard let data = data, error == nil else {
                                print("O/P error=\(error.debugDescription)")
                                failed(error.debugDescription as AnyObject!)
                                self.stopProgressLoading()
                                return
                            }
        
                            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                                print("O/P statusCode should be 200, but is \(httpStatus.statusCode)")
                                print("O/P response = \(String(describing: response))")
                                self.stopProgressLoading()
                                failed(response as AnyObject!)
                            }
        
                            let responseString = String(data: data, encoding: .utf8)
                            print("O/P responseString = \(String(describing: responseString))")
                            self.stopProgressLoading()
        
                            DispatchQueue.main.async {
                                success(responseString as AnyObject!)
                            }
        
                        })
                        task.resume()
                    }
        
                    private func startProgressLoading(isStart: Bool) {
                        DispatchQueue.main.async {
                            UIApplication.shared.isNetworkActivityIndicatorVisible = true
                        }
                    }
        
                    private func stopProgressLoading() {
                        DispatchQueue.main.async {
                            UIApplication.shared.isNetworkActivityIndicatorVisible = false
                        }
                    }
        
                }
        
                func getProductDetail(productID:String, success: @escaping (ProductDetailDataModel?) -> Void,  failed: @escaping (AnyObject!) -> Void) {
                    if isConnectedToInternet() {
                        theController.showLoader()
                        let addressURL = productDetailURL
        
                        let theParamDict = [WSKeys.product_id       : productID] as [String: AnyObject]
        
                        NetworkManager.shared.POSTRequset(showLoader: true, url: addressURL, parameter: theParamDict , success: { (responseObject) in
                            self.theController.hideLoader()
        
                            guard let data = responseObject.object(forKey: "data") as? NSDictionary else {
                                success(nil)
                                return
                            }
        
                            guard let storeInfo = data.object(forKey: "productDetailsInfo") as? [String: AnyObject] else {
                                success(nil)
                                return
                            }
        
                            let dataArray = self.setStoreDetail(dictData: storeInfo)
                            success(dataArray)
        
                        }, failed: { (error) in
                            self.theController.hideLoader()
                            print("error is \(error)")
                            failed(error)
                        })
                    } else {
                        failed("No Internet Connection" as AnyObject)
                    }
                }
        
        
        
        
        
        
        
        
            struct ProductDetailDataModel {
        
                var strStoreID: String? = nil
                var strPrice:NSNumber? = nil
                var strType:NSNumber? = nil
                var strSellerID:String? = nil
                var dicSeller:[String:AnyObject] = [:]
                var arrStoreMedia: [[String: AnyObject]]?
        
        
                mutating func setTheProperties(theDict: [String: AnyObject]) {
                    strStoreID          = "\(String(describing: theDict["product_id"]!))"
                    strPrice = theDict["price"] as? NSNumber
                    dicSeller = theDict["seller"] as! [String:AnyObject]
        
                    arrStoreMedia = theDict["products_medias"] as? [[String: AnyObject]]
        
                    for product in arrStoreMedia!
                    {
                        if let photo_original = product["photo_original"] as? String, photo_original != ""
                        {
                            strPhotoOrignal = photo_original
                            break;
                        }
                    }
        
        
        
        
                }
            }
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
                if indexPath.row == 0 {
                    let cell = tblHome.dequeueReusableCell(withIdentifier: "CellHeadetTC") as! CellHeadetTC
                    cell.advertisements = homeDetail.arrAdvertisement
                    return cell
                }
                else if indexPath.row == 1 {
                    let cell = tblHome.dequeueReusableCell(withIdentifier: "CellHomeTableView") as! CellHomeTableView
                    cell.selectionStyle = .none
                    cell.nav = self.navigationController
                    cell.arrCat = homeDetail.arrCategory
        
                    cell.collectionViewCategory.reloadData()
                    return cell
                }
                else {
                    let cell = tblHome.dequeueReusableCell(withIdentifier: "CellServiceTableView") as! CellServiceTableView
                    cell.selectionStyle = .none
                    if indexPath.row == 2 {
                        cell.lblheader.text = "Pending Service".localized()
                        cell.arrService = homeDetail.arrRecentService
                        cell.btnSeeAll.addTarget(self, action: #selector(HomeViewControlller.btnRecentSeeAllClicked(_:)), for: .touchUpInside)
                    }
                    else{
                        cell.lblheader.text = "Upcoming Services".localized()
                        cell.arrService = homeDetail.arrUpcommingService
                        cell.btnSeeAll.addTarget(self, action : #selector(HomeViewControlller.btnUpcomingSeeAllClicked(_:)), for: .touchUpInside)
                    }
        
                    return cell
                }
            }
        
          var arrCategory = [Categorys]()
          let temp = responseDict["data"]!.dictionaryValue
                        let arrCategory = temp["categories"]!.arrayValue
           let homeClass = HomeClass()
                        for i in 0..<arrCategory.count {
                            let dict = arrCategory[i].dictionaryValue
                            let categoryData = Categorys()
                            categoryData.strId = dict["id"]?.stringValue
                            homeClass.arrCategory.append(categoryData)
                        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多