swift2 Swift中包含NSURL请求的HTTP标头

aoyhnmkz  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(206)

有人知道如何在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 -我弹出了它,并得到了一个错误“cannot override data type”。我所有的搜索都显示Objective C帮助。有没有更好的方法尝试传递标头?

1cosmwyk

1cosmwyk1#

在Swift 3中,使用URLRequest structure而不是NSURLRequest(类似地,NSURLURLNSURLSessionURLSession等)。
然后使用addValue(_:for**HTTPHeaderField**:)添加一个标头。

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

在Swift 2.2中,如果需要修改,则使用NS**Mutable**URLRequest

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

ddrv8njm2#

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

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

bihw5rsg3#

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()
bxfogqkk

bxfogqkk4#

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

相关问题