Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift iOS9基本HTTP请求_Swift_Ios9_Xcode7 - Fatal编程技术网

Swift iOS9基本HTTP请求

Swift iOS9基本HTTP请求,swift,ios9,xcode7,Swift,Ios9,Xcode7,我已经研究了过去几个小时,在我的Swift应用程序中找不到一个在iOS 9中工作的例子。我只想对url“”执行HTTP GET请求。URL将返回将被解析的XML数据,但现在我只想运行HTTPGET命令 我是Xcode新手,但有一些编程背景,但不知道如何获取URL来执行get命令 我有一个按钮,我希望它在按下按钮时运行HTTPGET请求。在线浏览NSURLSession示例时,我找不到一个不会抛出语法错误的示例。任何帮助都将不胜感激。下面是我发现的一个,但它抛出了一堆错误。任何指导都将不胜感激 i

我已经研究了过去几个小时,在我的Swift应用程序中找不到一个在iOS 9中工作的例子。我只想对url“”执行HTTP GET请求。URL将返回将被解析的XML数据,但现在我只想运行HTTPGET命令

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

我有一个按钮,我希望它在按下按钮时运行HTTPGET请求。在线浏览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)

下面是我使用的获取方法:

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
文件。如果文件是从默认模板创建的(例如在新的单视图应用程序中),请在最后一个数组元素后添加以下键


使用带有参数的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();
}

清理后的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
这修复了原始代码片段中的明显错误(偶尔使用
而不是
;使用不推荐的
println
而不是
print
;在第一次
回调
调用之后使用无关的
;添加一些缺少的可选展开;等等)

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

  • 使用
    String
    而不是
    NSString
  • 使
    回调
    字符串
    参数为可选(而不是在出现错误时返回
  • 我认为最好返回实际的
    NSError
    对象,而不仅仅是本地化描述(在某些情况下,您可能实际上关心错误的
    code
  • 使用Swift 2
    guard
    语句防止出现任何错误

成功了!非常感谢!哇,4个小时后我终于让它开始工作了!现在开始将返回的XML解析为变量…这可能是Info.plist的问题。问题是http请求可能会发送到任何我将让用户根据其系统定义的IP地址。如果不知道,您将如何添加规则w域名是什么?没关系,我知道了
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)
}
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();
}
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