iOS 9 基本 HTTP 请求
iOS 9 Basic HTTP Request
我研究了过去几个小时,但在我的 Swift 应用程序中找不到适用于 iOS 9 的示例。我只是想对 url “http://www.example.com” 执行 HTTP GET 请求。 URL 将 return 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)
这是我使用的 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();
}
清理后的 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
;第一个 callback
调用后的无关 ,
;添加一些缺少的可选展开;等等)。
这也解决了一些其他问题,即
- 使用
String
而不是NSString
;
- 使
callback
的 String
参数可选(而不是在出现错误时 returning ""
);
- 我认为 return 实际的
NSError
对象比本地化描述更可取(在某些时候,您可能实际上关心 code
或 domain
的错误)
- 使用 Swift 2
guard
语句来防止发生任何错误。
我研究了过去几个小时,但在我的 Swift 应用程序中找不到适用于 iOS 9 的示例。我只是想对 url “http://www.example.com” 执行 HTTP GET 请求。 URL 将 return 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)
这是我使用的 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();
}
清理后的 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
;第一个 callback
调用后的无关 ,
;添加一些缺少的可选展开;等等)。
这也解决了一些其他问题,即
- 使用
String
而不是NSString
; - 使
callback
的String
参数可选(而不是在出现错误时 returning""
); - 我认为 return 实际的
NSError
对象比本地化描述更可取(在某些时候,您可能实际上关心code
或domain
的错误) - 使用 Swift 2
guard
语句来防止发生任何错误。