do {
let opt = try HTTP.GET("https://google.com")
opt.start { response in
if let err = response.error {
print("error: \(err.localizedDescription)")
return //also notify app of failure as needed
}
print("opt finished: \(response.description)")
//print("data is: \(response.data)") access the response of the data with response.data
}
} catch let error {
print("got an error creating the request: \(error)")
}
1
var post:NSString = "api=myposts&userid=\(uid)&page_no=0&limit_no=10"
NSLog("PostData: %@",post);
var url1:NSURL = NSURL(string: url)!
var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!
var postLength:NSString = String( postData.length )
var request:NSMutableURLRequest = NSMutableURLRequest(URL: url1)
request.HTTPMethod = "POST"
request.HTTPBody = postData
request.setValue(postLength, forHTTPHeaderField: "Content-Length")
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
var reponseError: NSError?
var response: NSURLResponse?
var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)
if ( urlData != nil ) {
let res = response as NSHTTPURLResponse!;
NSLog("Response code: %ld", res.statusCode);
if (res.statusCode >= 200 && res.statusCode < 300)
{
var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!
NSLog("Response ==> %@", responseData);
var error: NSError?
let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary
let success:NSInteger = jsonData.valueForKey("error") as NSInteger
//[jsonData[@"success"] integerValue];
NSLog("Success: %ld", success);
if(success == 0)
{
NSLog("Login SUCCESS");
self.dataArr = jsonData.valueForKey("data") as NSMutableArray
self.table.reloadData()
} else {
NSLog("Login failed1");
ZAActivityBar.showErrorWithStatus("error", forAction: "Action2")
}
} else {
NSLog("Login failed2");
ZAActivityBar.showErrorWithStatus("error", forAction: "Action2")
}
} else {
NSLog("Login failed3");
ZAActivityBar.showErrorWithStatus("error", forAction: "Action2")
}
它肯定会对你有所帮助
20
Swift 3 and above Data Request using URLSession API
//create the url with NSURL
let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")! //change the url
//create the session object
let session = URLSession.shared
//now create the URLRequest object using the url object
let request = URLRequest(url: url)
//create dataTask using the session object to send data to the server
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else {
return
}
guard let data = data else {
return
}
do {
//create json object from data
if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
print(json)
}
} catch let error {
print(error.localizedDescription)
}
})
task.resume()
Swift 4, Decodable and Result enum
//APPError enum which shows all possible errors
enum APPError: Error {
case networkError(Error)
case dataNotFound
case jsonParsingError(Error)
case invalidStatusCode(Int)
}
//Result enum to show success or failure
enum Result<T> {
case success(T)
case failure(APPError)
}
//dataRequest which sends request to given URL and convert to Decodable Object
func dataRequest<T: Decodable>(with url: String, objectType: T.Type, completion: @escaping (Result<T>) -> Void) {
//create the url with NSURL
let dataURL = URL(string: url)! //change the url
//create the session object
let session = URLSession.shared
//now create the URLRequest object using the url object
let request = URLRequest(url: dataURL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 60)
//create dataTask using the session object to send data to the server
let task = session.dataTask(with: request, completionHandler: { data, response, error in
guard error == nil else {
completion(Result.failure(AppError.networkError(error!)))
return
}
guard let data = data else {
completion(Result.failure(APPError.dataNotFound))
return
}
do {
//create decodable object from data
let decodedObject = try JSONDecoder().decode(objectType.self, from: data)
completion(Result.success(decodedObject))
} catch let error {
completion(Result.failure(APPError.jsonParsingError(error as! DecodingError)))
}
})
task.resume()
}
struct ToDo: Decodable {
let id: Int
let userId: Int
let title: String
let completed: Bool
}
dataRequest(with: "https://jsonplaceholder.typicode.com/todos/1", objectType: ToDo.self) { (result: Result) in
switch result {
case .success(let object):
print(object)
case .failure(let error):
print(error)
}
}
//这打印结果:
ToDo(id: 1, userId: 1, title: "delectus aut autem", completed: false)
0
我在点击登录按钮时调用json
@IBAction func loginClicked(sender : AnyObject) {
var request = NSMutableURLRequest(URL: NSURL(string: kLoginURL)) // Here, kLogin contains the Login API.
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(self.criteriaDic(), options: nil, error: &err) // This Line fills the web service with required parameters.
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
var err1: NSError?
var json2 = NSJSONSerialization.JSONObjectWithData(strData.dataUsingEncoding(NSUTF8StringEncoding), options: .MutableLeaves, error:&err1 ) as NSDictionary
println("json2 :\(json2)")
if(err) {
println(err!.localizedDescription)
}
else {
var success = json2["success"] as? Int
println("Success: \(success)")
}
})
task.resume()
}
在这里,我为参数制作了一个单独的字典 .
var params = ["format":"json", "MobileType":"IOS","MIN":"f8d16d98ad12acdbbe1de647414495ec","UserName":emailTxtField.text,"PWD":passwordTxtField.text,"SigninVia":"SH"]as NSDictionary
return params
}
// You can add your own sets of parameter here.
93
这是操场上一个非常简单的 Swift 4 示例:
import UIKit
// run asynchronously in a playground
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
// create a url
let url = URL(string: "http://www.stackoverflow.com")
// create a data task
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil {
print("there's a problem")
}
print(String(data: data!, encoding: String.Encoding.utf8) ?? "")
}
//running the task w/ resume
task.resume()
func insertRecords()
{
let usrID = txtID.text
let checkin = lblInOut.text
let comment = txtComment.text
// The address of the web service
let urlString = "http://your_url/checkInOut_post.php"
// These are the keys that your are sending as part of the post request
let keyValues = "id=\(usrID)&inout=\(checkin)&comment=\(comment)"
// 1 - Create the session by getting the configuration and then
// creating the session
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil)
// 2 - Create the URL Object
if let url = NSURL(string: urlString){
// 3 - Create the Request Object
var request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
// set the key values
request.HTTPBody = keyValues.dataUsingEncoding(NSUTF8StringEncoding);
// 4 - execute the request
let taskData = session.dataTaskWithRequest(request, completionHandler: {
(data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in
println("\(data)")
// 5 - Do something with the Data back
if (data != nil) {
// we got some data back
println("\(data)")
let result = NSString(data: data , encoding: NSUTF8StringEncoding)
println("\(result)")
if result == "OK" {
let a = UIAlertView(title: "OK", message: "Attendece has been recorded", delegate: nil, cancelButtonTitle: "OK")
println("\(result)")
dispatch_async(dispatch_get_main_queue()) {
a.show()
}
} else {
// display error and do something else
}
} else
{ // we got an error
println("Error getting stores :\(error.localizedDescription)")
}
})
taskData.resume()
}
}
PHP代码获取键值
$ empID = $ _POST ['id'];
$ inOut = $ _POST ['inout'];
$ comment = $ _POST ['comment'];
18
Basic Swift 3 Solution
let url = URL(string: "http://www.stackoverflow.com")
let task = URLSession.shared.dataTask(with: url! as URL) { data, response, error in
guard let data = data, error == nil else { return }
print(NSString(data: data, encoding: String.Encoding.utf8.rawValue))
}
task.resume()
91
下面给出了样本“GET”请求的示例 .
let urlString = "YOUR_GET_URL"
let yourURL = URL(string: urlstring)
let dataTask = URLSession.shared.dataTask(with: yourURL) { (data, response, error) in
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
print("json --- \(json)")
}catch let err {
print("err---\(err.localizedDescription)")
}
}
dataTask.resume()
// synchronous GET request with URL query a=1
let r = Just.get("https://httpbin.org/get", params:["a":1])
// asynchronous POST request with form value and file uploads
Just.post(
"http://justiceleauge.org/member/register",
data: ["username": "barryallen", "password":"ReverseF1ashSucks"],
files: ["profile_photo": .URL(fileURLWithPath:"flash.jpeg", nil)]
) { (r)
if (r.ok) { /* success! */ }
}
在这两种情况下,可以通过类似于 python-request 的方式访问请求 r 的结果:
r.ok // is the response successful?
r.statusCode // status code of response
r.content // response body as NSData?
r.text // response body as text?
r.json // response body parsed by NSJSONSerielization
override func viewDidLoad() {
super.viewDidLoad()
// setup the Notification observer to catch the result of check username and password
NSNotificationCenter.defaultCenter().addObserver(self, selector: "checkedUsernameAndPassword:", name: CHECK_USERNAME_AND_PASSWORD, object: nil)
let username = GlobalVariables.USER_NAME
let password = GlobalVariables.PASSWORD
// check username and password
if let jsonString = Utility.checkUsernameAndPasswordJson(username, password:password){
print("json string returned = \(jsonString)")
let url = CHECKUSERJSON+jsonString
// CHECKUSERJSON = http://www.example.com/handler.php?do=CheckUserJson&json=
// jsonString = {\"username\":\"demo\",\"password\":\"demo\"}"
// the php script handles a json request and returns a string identifier
Utility.getHTTPRequest(url,notifierId: CHECK_USERNAME_AND_PASSWORD)
// the returned identifier is sent to the checkedUsernaeAndPassword function when it becomes availabel.
}
}
let url = URL(string: "http://www.stackoverflow.com")!
let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
guard let data = data else { return }
print(String(data: data, encoding: .utf8)!)
}
task.resume()
使用NSURLConnection
首先,初始化 URL 和 URLRequest :
let url = URL(string: "http://www.stackoverflow.com")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
然后,您可以异步加载请求:
NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue.main) {(response, data, error) in
guard let data = data else { return }
print(String(data: data, encoding: .utf8)!)
}
或者您可以初始化 NSURLConnection :
let connection = NSURLConnection(request: request, delegate:nil, startImmediately: true)
16 回答
到目前为止,我正在使用这个人的包装器,效果很好https://github.com/daltoniam/swiftHTTP . 到目前为止没有大的leaky abstractions
例
它肯定会对你有所帮助
Swift 3 and above Data Request using URLSession API
Swift 4, Decodable and Result enum
example:
//如果我们想从占位符API获取todo,那么我们定义ToDo结构并调用dataRequest并传递“https://jsonplaceholder.typicode.com/todos/1”字符串url .
//这打印结果:
在这里,我为参数制作了一个单独的字典 .
这是操场上一个非常简单的 Swift 4 示例:
另一个选项是提供可链接请求/响应方法的 Alamofire lib .
https://github.com/Alamofire/Alamofire
Making a Request
Response Handling
检查以下代码:
1. SynchonousRequest
Swift 1.2
Swift 2.0 +
2. AsynchonousRequest
Swift 1.2
Swift 2.0 +
3. As usual URL connection
Swift 1.2
然后
Swift 2.0 +
然后
4. Asynchonous POST Request
Swift 1.2
Swift 2.0 +
5. Asynchonous GET Request
Swift 1.2
Swift 2.0 +
6. Image(File) Upload
Swift 2.0 +
详情
Xcode 9.2,Swift 4
解决方案
用法
结果
//这是一个适合我的例子
//使用键值向服务器发送请求的Swift函数
PHP代码获取键值
$ empID = $ _POST ['id'];
$ inOut = $ _POST ['inout'];
$ comment = $ _POST ['comment'];
Basic Swift 3 Solution
下面给出了样本“GET”请求的示例 .
您可以使用Just,一个
python-requests
样式的HTTP库 .使用Just发送HTTP请求的一些示例:
在这两种情况下,可以通过类似于
python-request
的方式访问请求r
的结果:你可以在这里找到更多的例子playground
在游乐场中以同步模式使用此库是最接近Swift的cURL .
一个简单的Swift 2.0方法来发出HTTP GET请求
HTTP请求是异步的,因此您需要一种从HTTP请求获取返回值的方法 . 此方法使用通知程序,并分布在两个类中 .
示例是使用网站http://www.example.com/handler.php?do=CheckUserJson&json=检查标识符令牌的用户名和密码 . 该文件名为handler.php,并且在do参数上有一个switch语句以获取RESTful方法 .
在viewDidLoad中,我们设置NotifierObserver,设置json并调用getHTTPRequest函数 . 它将使用http请求中返回的参数返回函数checkedUsernameAndPassword .
Utility.swift中有两个静态函数,首先对json进行编码,然后进行HTTP调用 .
和Http请求
sendNotification函数完成圆圈 . 请注意,在Obh Observer中,选择器字符串的末尾有一个“:” . 这允许通知在userInfo中携带有效负载 . 我给它一个String和一个Int .
请注意,使用HTTP是oldFashioned,更喜欢HTTPS,请参阅How do I load an HTTP URL with App Transport Security enabled in iOS 9?
在Swift 4.2和Xcode10中 .
JSON POST 方法示例
如果您有兴趣在 SharedClass 中使用此功能
最后像这样调用这个函数....
您可以像在Objective-C中一样使用
URL
,URLRequest
和URLSession
或NSURLConnection
. 请注意,对于iOS 7.0及更高版本,首选URLSession
.使用URLSession
从
URLSession
初始化URL
对象和URLSessionDataTask
. 然后使用resume()
运行任务 .使用NSURLConnection
首先,初始化
URL
和URLRequest
:然后,您可以异步加载请求:
或者您可以初始化
NSURLConnection
:只需确保将委托设置为
nil
以外的其他内容,并使用委托方法处理收到的响应和数据 .有关更多详细信息,请查看documentation for the NSURLConnectionDataDelegate protocol
在Xcode游乐场上进行测试
如果您想在Xcode游乐场上尝试此代码,请将
import PlaygroundSupport
添加到您的游乐场,以及以下调用:这将允许您在游乐场中使用异步代码 .
我用 JSON Parsing 这样做 HTTP 请求 Both 方法 GET & POST :
在 viewDidLoad() :
Done