带有基本身份验证的 iOS swift Web 服务调用

Posted

技术标签:

【中文标题】带有基本身份验证的 iOS swift Web 服务调用【英文标题】:iOS swift web service call with basic authentication 【发布时间】:2017-05-10 21:02:49 【问题描述】:

我想从 Web 服务获取一些数据 (JSON) 快疯了。

有人可以告诉我如何在此通话中添加用户名和密码身份验证吗?它不能像下面的代码。如果您有一些适用于 swift 3.0 的代码,我会很乐意看到它。

func downloadData()

    let url = NSURL(string: "https://www.someurl.com")
    let request = NSMutableURLRequest(url: url! as URL)

    let task = URLSession.shared.dataTask(with: request as URLRequest)  data,response,error in
        guard error == nil && data != nil else
        
            print("Error:",error!)
            return
        

        let httpStatus = response as? HTTPURLResponse

        if httpStatus!.statusCode == 200
        
            if data?.count != 0
            
                let responseString = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary //because JSON data started with dictionary. Not an array
                let status = responseString["status"] as! String

                if status == "ok"
                
                    print("Status is :", status)

                    //Ok, so far so good. Now let's get the data...
                
                else
                
                    print("Status is not Okay!")
                
            
            else
            
                print("No data got from url!")
            
        
        else
        
            print("error httpstatus code is :",httpStatus!.statusCode)
        
    
    task.resume()

【问题讨论】:

为什么会被否决?这是一个完全合法的问题。如果没有,应该有很多答案,正确的方法是如何解决这个问题。 【参考方案1】:

这取决于您的网络服务,但您需要将这些值添加到您的Request

例如向标题添加值:

let request = NSMutableURLRequest(url: url! as URL)
request.addValue("An_Authentication_String", forHTTPHeaderField: "MyField")

或者您可能需要将正文添加到您的 Request: How to make HTTP Post request with JSON body in Swift

【讨论】:

【参考方案2】:

我的错。我对这个有点太仓促了。我回来的不是 JSON,而是 XML。如果有人想知道,这就是带有基本身份验证的代码......

    let config = URLSessionConfiguration.default
    let userPasswordString = "myusername:mypassword"
    let userPasswordData = userPasswordString.data(using: String.Encoding.utf8)
    let base64EncodedCredential = userPasswordData!.base64EncodedString()
    let authString = "Basic \(base64EncodedCredential)"
    config.httpAdditionalHeaders = ["Authorization" : authString]
    let session = URLSession(configuration: config)

    let url = URL(string: "theWebServiceUrl")!
    var dataString = ""

    let task = session.dataTask(with: url, completionHandler: 
        (data, response, error) in

        if error != nil 
            print(error!.localizedDescription)
         else 
             //this is the XML, now go to town with an XML parser
             dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as! String
        
    )
    task.resume()

【讨论】:

以上是关于带有基本身份验证的 iOS swift Web 服务调用的主要内容,如果未能解决你的问题,请参考以下文章

Swift iOS - 使用 p12 对网站进行身份验证

带有 Spotify iOS SDK 的 Cordova iOS - 触发身份验证

如何使用基本身份验证保护 android/ios 应用程序的 Web API

带有身份验证的 okhttp 发布请求

在 Swift 中使用 WKWebView 进行身份验证

使用带有摘要身份验证、jquery ajax 调用的 RestFul PHP Web 服务