为 swift 添加 POST,PUT,DELETE 请求 class
Add POST,PUT,DELETE request class for swift
我已经创建了一个客户端服务 class 来从 Web api 发出调用 GET
请求。我尝试扩展但有更多的网络方法 POST
、PUT
、Delete
。我没有找到如何使用 [= 创建 POST、PUT、Delete 的好例子25=] closure.I 就想问问如何添加POST,PUT,Delete到客户端?
import Foundation
class ClientService{
func getClients(searchstring:String,pageNumber:Int,callBack:(NSArray)->()){
request("\(_settings.baseUrl)Client/\(searchstring)/\(String(pageNumber))/rrn/brns", callBack: callBack)
}
func request(url:String,callBack:(NSArray)->()){
let nsURL = NSURL(string:url);
let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL!){
(data,response,error) in
do {
let response = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray
callBack(response)
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
}
task.resume()
}
init(){
self._settings = Settings();
}
var _settings:Settings!;
}
我在 mes 项目中使用 Alamofire(Swift 中的优雅 HTTP 网络),我喜欢它
所以示例如何使用 POST
let parameters = [
"foo": "bar",
"baz": ["a", 1],
"qux": [
"x": 1,
"y": 2,
"z": 3
]
]
Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
以及如何使用删除
Alamofire.request(.DELETE, "https://httpbin.org/delete")
转到文档非常好
https://github.com/Alamofire/Alamofire
如果你想在没有框架的情况下使用 swift
这是如何使用的示例 POST
var request = NSMutableURLRequest(URL: NSURL(string: "http://localhost:4567/login"))
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var params = ["username":"jameson", "password":"password"] as Dictionary<String, String>
var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
println("Response: \(response)")
var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Body: \(strData)")
var err: NSError?
var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary
// Did the JSONObjectWithData constructor return an error? If so, log the error to the console
if(err != nil) {
println(err!.localizedDescription)
let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Error could not parse JSON: '\(jsonStr)'")
}
else {
// The JSONObjectWithData constructor didn't return an error. But, we should still
// check and make sure that json has a value using optional binding.
if let parseJSON = json {
// Okay, the parsedJSON is here, let's get the value for 'success' out of it
var success = parseJSON["success"] as? Int
println("Succes: \(success)")
}
else {
// Woa, okay the json object was nil, something went worng. Maybe the server isn't running?
let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Error could not parse JSON: \(jsonStr)")
}
}
})
task.resume()
您可以像这样创建一个 HTTP 请求,而不是使用 dataTaskWithUrl
:
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = jsonData
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue(String (jsonData?.length), forHTTPHeaderField: "Content-Length")
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { data, res, error in
// etc etc
上面示例中的其他所有内容都是相同的。当然,您必须提供 json 数据。为此,您可以这样做:
let data: [String: AnyObject] = ["nameValue": dataValue]
var jsonData: NSData? = nil
do {
jsonData = try NSJSONSerialization.dataWithJSONObject(data, options: NSJSONWritingOptions(rawValue: 0))
} catch {
// some error serializing
}
你走在正确的轨道上。我为 get、post、put、delete 等创建了一个单独的函数。但是如果你愿意,你可以将它们放在一个函数中。
请记住,这段代码只是为了说明如何操作。您需要根据需要对其进行修改。
func request(url:String, method: String, params: [String: String], completion: ([AnyObject])->() ){
if let nsURL = NSURL(string:url) {
let request = NSMutableURLRequest(URL: nsURL)
if method == "POST" {
// convert key, value pairs into param string
postString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
request.HTTPMethod = "POST"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
}
else if method == "GET" {
postString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
request.HTTPMethod = "GET"
}
else if method == "PUT" {
putString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
request.HTTPMethod = "PUT"
request.HTTPBody = putString.dataUsingEncoding(NSUTF8StringEncoding)
}
// Add other verbs here
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, response, error) in
do {
// what happens if error is not nil?
// That means something went wrong.
// Make sure there really is some data
if let data = data {
let response = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
completion(response)
}
else {
// Data is nil.
}
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
}
task.resume()
}
else{
// Could not make url. Is the url bad?
// You could call the completion handler (callback) here with some value indicating an error
}
}
这样称呼它:
request("http://somedomain.etc", "POST", ["key1" : "value1", "key2", "values2"]) {
(result) in
// Handle result here.
}
你会注意到我去掉了 NSArray。 [AnyObject] 是执行此操作的 Swift 方法。
我建议您在完成处理程序中添加某种错误指示器。这会让您检测到出现问题并进行处理。
使用时要非常小心!展开变量。这是应用程序崩溃的最常见原因。
Swift 4个版本(我认为):
func restRequest(url:String, method: String, params: [String: String], completion: @escaping ([AnyObject])->() ){
if let nsURL = NSURL(string:url) {
let request = NSMutableURLRequest(url: nsURL as URL)
if method == "POST" {
// convert key, value pairs into param string
let postString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
request.httpMethod = "POST"
request.httpBody = postString.data(using: String.Encoding.utf8)
}
else if method == "GET" {
let postString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
request.httpMethod = "GET"
}
else if method == "PUT" {
let putString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
request.httpMethod = "PUT"
request.httpBody = putString.data(using: String.Encoding.utf8)
}
// Add other verbs here
let task = URLSession.shared.dataTask(with: request as URLRequest) {
(data, response, error) in
do {
// what happens if error is not nil?
// That means something went wrong.
// Make sure there really is some data
if let data = data {
let response = try JSONSerialization.JSONObjectWithData(data, options: JSONSerialization.ReadingOptions.MutableContainers)
completion(response)
}
else {
// Data is nil.
}
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
}
task.resume()
}
else{
// Could not make url. Is the url bad?
// You could call the completion handler (callback) here with some value indicating an error
}
}
我已经创建了一个客户端服务 class 来从 Web api 发出调用 GET
请求。我尝试扩展但有更多的网络方法 POST
、PUT
、Delete
。我没有找到如何使用 [= 创建 POST、PUT、Delete 的好例子25=] closure.I 就想问问如何添加POST,PUT,Delete到客户端?
import Foundation
class ClientService{
func getClients(searchstring:String,pageNumber:Int,callBack:(NSArray)->()){
request("\(_settings.baseUrl)Client/\(searchstring)/\(String(pageNumber))/rrn/brns", callBack: callBack)
}
func request(url:String,callBack:(NSArray)->()){
let nsURL = NSURL(string:url);
let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL!){
(data,response,error) in
do {
let response = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray
callBack(response)
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
}
task.resume()
}
init(){
self._settings = Settings();
}
var _settings:Settings!;
}
我在 mes 项目中使用 Alamofire(Swift 中的优雅 HTTP 网络),我喜欢它
所以示例如何使用 POST
let parameters = [
"foo": "bar",
"baz": ["a", 1],
"qux": [
"x": 1,
"y": 2,
"z": 3
]
]
Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
以及如何使用删除
Alamofire.request(.DELETE, "https://httpbin.org/delete")
转到文档非常好 https://github.com/Alamofire/Alamofire 如果你想在没有框架的情况下使用 swift
这是如何使用的示例 POST
var request = NSMutableURLRequest(URL: NSURL(string: "http://localhost:4567/login"))
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var params = ["username":"jameson", "password":"password"] as Dictionary<String, String>
var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
println("Response: \(response)")
var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Body: \(strData)")
var err: NSError?
var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary
// Did the JSONObjectWithData constructor return an error? If so, log the error to the console
if(err != nil) {
println(err!.localizedDescription)
let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Error could not parse JSON: '\(jsonStr)'")
}
else {
// The JSONObjectWithData constructor didn't return an error. But, we should still
// check and make sure that json has a value using optional binding.
if let parseJSON = json {
// Okay, the parsedJSON is here, let's get the value for 'success' out of it
var success = parseJSON["success"] as? Int
println("Succes: \(success)")
}
else {
// Woa, okay the json object was nil, something went worng. Maybe the server isn't running?
let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Error could not parse JSON: \(jsonStr)")
}
}
})
task.resume()
您可以像这样创建一个 HTTP 请求,而不是使用 dataTaskWithUrl
:
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = jsonData
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue(String (jsonData?.length), forHTTPHeaderField: "Content-Length")
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { data, res, error in
// etc etc
上面示例中的其他所有内容都是相同的。当然,您必须提供 json 数据。为此,您可以这样做:
let data: [String: AnyObject] = ["nameValue": dataValue]
var jsonData: NSData? = nil
do {
jsonData = try NSJSONSerialization.dataWithJSONObject(data, options: NSJSONWritingOptions(rawValue: 0))
} catch {
// some error serializing
}
你走在正确的轨道上。我为 get、post、put、delete 等创建了一个单独的函数。但是如果你愿意,你可以将它们放在一个函数中。
请记住,这段代码只是为了说明如何操作。您需要根据需要对其进行修改。
func request(url:String, method: String, params: [String: String], completion: ([AnyObject])->() ){
if let nsURL = NSURL(string:url) {
let request = NSMutableURLRequest(URL: nsURL)
if method == "POST" {
// convert key, value pairs into param string
postString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
request.HTTPMethod = "POST"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
}
else if method == "GET" {
postString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
request.HTTPMethod = "GET"
}
else if method == "PUT" {
putString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
request.HTTPMethod = "PUT"
request.HTTPBody = putString.dataUsingEncoding(NSUTF8StringEncoding)
}
// Add other verbs here
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, response, error) in
do {
// what happens if error is not nil?
// That means something went wrong.
// Make sure there really is some data
if let data = data {
let response = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
completion(response)
}
else {
// Data is nil.
}
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
}
task.resume()
}
else{
// Could not make url. Is the url bad?
// You could call the completion handler (callback) here with some value indicating an error
}
}
这样称呼它:
request("http://somedomain.etc", "POST", ["key1" : "value1", "key2", "values2"]) {
(result) in
// Handle result here.
}
你会注意到我去掉了 NSArray。 [AnyObject] 是执行此操作的 Swift 方法。
我建议您在完成处理程序中添加某种错误指示器。这会让您检测到出现问题并进行处理。
使用时要非常小心!展开变量。这是应用程序崩溃的最常见原因。
Swift 4个版本(我认为):
func restRequest(url:String, method: String, params: [String: String], completion: @escaping ([AnyObject])->() ){
if let nsURL = NSURL(string:url) {
let request = NSMutableURLRequest(url: nsURL as URL)
if method == "POST" {
// convert key, value pairs into param string
let postString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
request.httpMethod = "POST"
request.httpBody = postString.data(using: String.Encoding.utf8)
}
else if method == "GET" {
let postString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
request.httpMethod = "GET"
}
else if method == "PUT" {
let putString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
request.httpMethod = "PUT"
request.httpBody = putString.data(using: String.Encoding.utf8)
}
// Add other verbs here
let task = URLSession.shared.dataTask(with: request as URLRequest) {
(data, response, error) in
do {
// what happens if error is not nil?
// That means something went wrong.
// Make sure there really is some data
if let data = data {
let response = try JSONSerialization.JSONObjectWithData(data, options: JSONSerialization.ReadingOptions.MutableContainers)
completion(response)
}
else {
// Data is nil.
}
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
}
task.resume()
}
else{
// Could not make url. Is the url bad?
// You could call the completion handler (callback) here with some value indicating an error
}
}