【问题标题】:iOS 9 Basic HTTP RequestiOS 9 基本 HTTP 请求
【发布时间】:2015-10-25 05:32:22
【问题描述】:

我研究了过去几个小时,在我的 Swift 应用程序中找不到适用于 iOS 9 的示例。我只想对 url "http://www.example.com" 发出 HTTP GET 请求。该 URL 将返回将被解析的 XML 数据,但现在我只想让 HTTP GET 命令运行。

我是 Xcode 新手,但有一些编程背景,但不知道如何获取 URL 来执行 GET 命令

我有一个按钮,我希望它在按下按钮时运行 HTTP GET 请求。在线查看 NSURLSession 示例时,我找不到不会引发语法错误的示例。任何帮助,将不胜感激。下面是我发现的一个,但它抛出了一堆错误。任何指导将不胜感激。

import Foundation
import XCPlayground
func httpGet(request: NSURLRequest!, callback: (String, String?) -> Void) {
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in
        if error != nil {
            callback("”, error.localizedDescription),
        } else {
            var result = NSString(data: data, encoding:
                NSASCIIStringEncoding)!
            callback(result, nil)
        }
    }
    task.resume()
}
var request = NSMutableURLRequest(URL: NSURL(string: “http://www.google.com")!)

httpGet(request){
    (data, error) -> Void in
    if error != nil {
        println(error)
    } else {
        println(data)
    }
}
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)

【问题讨论】:

    标签: swift ios9 xcode7


    【解决方案1】:

    您的代码示例经过清理的 Swift 2 版本可能如下所示:

    import Foundation
    import XCPlayground
    
    func httpGet(request: NSURLRequest, callback: (String?, NSError?) -> Void) {
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
            guard error == nil && data != nil else {
                callback(nil, error)
                return
            }
    
            callback(String(data: data!, encoding: NSUTF8StringEncoding), nil)
        }
        task.resume()
    }
    
    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.google.com")!)
    
    httpGet(request) { string, error in
        guard error == nil && string != nil else {
            print(error?.localizedDescription)
            return
        }
    
        print(string!)
    }
    
    XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
    

    这修复了原始代码 sn-p 中的明显错误(偶尔使用“ 和” 而不是";使用已弃用的println 而不是print;无关紧要的@ 987654327@ 在第一次 callback 调用之后;添加一些缺少的可选展开;等等)。

    这也解决了一些其他问题,即,

    • 使用String 而不是NSString;
    • 使callback 的String 参数可选(而不是在出现错误时返回"");
    • 我认为最好返回实际的NSError 对象,而不仅仅是本地化的描述(在某些时候,您可能实际上关心错误的code 或domain)
    • 使用 Swift 2 guard 语句来防范发生的任何错误。

    【讨论】:

    • 做到了!非常感谢!哇,四个小时后,我终于让它工作了!现在开始将返回的 XML 解析为变量。 . .
    【解决方案2】:

    这是我使用的 GET 方法:

    func get(url : String, successHandler: (response: String) -> Void) {
        let url = NSURL(string: url)
        let request = NSMutableURLRequest(URL: url!);
        request.HTTPMethod = "GET"
    
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in
    
            //in case of error
            if error != nil {
                return
            }
    
            let responseString : String = String(data: data!, encoding: NSUTF8StringEncoding)!
            successHandler(response: responseString)
        }
        task.resume();
    }
    

    由于您发出的是纯 HTTP 请求,因此您需要修改您的 Info.plist 文件。如果您的文件是从默认模板创建的(例如在新的单视图应用程序中),则在最后一个数组元素之后添加以下键。

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <false/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>google.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
        </dict>
    </dict>
    

    允许任意数量的域的不太安全的方法:

    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
          <true/>
    </dict>
    

    最后,您可以在viewDidLoad() 函数中测试上述方法以及任何回调。我打电话给我的回调updateWebview,但你的当然可以叫任何名字。

    override func viewDidLoad() {
        super.viewDidLoad()
        let url = "http://www.google.com"
        get(url, successHandler: {(response) in self.updateWebview(response)});
    }
    
    func updateWebview(let html: String) {
        print(html)
    }
    

    使用带有参数的 POST 的示例:

    func post(url : String, params : String, successHandler: (response: String) -> Void) {
        let url = NSURL(string: url)
        let params = String(params);
        let request = NSMutableURLRequest(URL: url!);
        request.HTTPMethod = "POST"
        request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding)
    
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in
    
            //in case of error
            if error != nil {
                return
            }
    
            let responseString : String = String(data: data!, encoding: NSUTF8StringEncoding)!
            successHandler(response: responseString)
        }
        task.resume();
    }
    

    【讨论】:

    • 这可能是 Info.plist 的问题。问题是 http 请求可能会发送到我将让用户根据他们的系统定义的任何 IP 地址。如果您不知道域是什么,您将如何添加规则?
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多