首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 9基本HTTP请求

iOS 9基本HTTP请求
EN

Stack Overflow用户
提问于 2015-10-25 05:32:22
回答 2查看 1.8K关注 0票数 2

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

我对Xcode很陌生,但我有一些编程背景,但我不知道如何获得一个URL来执行get命令

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

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-25 06:19:32

您的代码示例的清理、Swift 2呈现可能如下所示:

代码语言:javascript
复制
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;在第一个callback调用之后使用无关的,;添加一些缺少的可选展开;等等)。

这还涉及其他一些问题,即,

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

Stack Overflow用户

发布于 2015-10-25 05:59:39

下面是我使用的GET方法:

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

代码语言:javascript
复制
<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>

一种不太安全的方法,允许任意数目的域:

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

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

代码语言:javascript
复制
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的示例:

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33326555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档