代码之家  ›  专栏  ›  技术社区  ›  AConsiglio

如何在Swift中创建GET、POST和PUT请求?

  •  5
  • AConsiglio  · 技术社区  · 9 年前

    我可以用swift中的这段代码同步连接到服务器。

    let URL: NSURL = NSURL(string: "http://someserver.com)!
    let InfoJSON: NSData? = NSData(contentsOfURL: URL)
    let JsonInfo: NSString = NSString(data:InfoJSON!, encoding: NSUTF8StringEncoding)!
    let GameListAttributions: NSArray = NSJSONSerialization.JSONObjectWithData(InfoJSON!, options: .allZeros, error: nil)! as NSArray
    

    这只适用于一次接收所有信息,但我如何在Swift中使用GET、POST和PUT。无论我搜索多少,我都找不到关于如何执行这些的好教程或示例。

    4 回复  |  直到 9 年前
        1
  •  9
  •   Yunus Nedim Mehel    4 年前
    let url = NSURL(string: "https://yourUrl.com") //Remember to put ATS exception if the URL is not https
    let request = NSMutableURLRequest(url: url! as URL)
    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") //Optional
    request.httpMethod = "PUT"
    let session = URLSession(configuration:URLSessionConfiguration.default, delegate: nil, delegateQueue: nil)
    let data = "username=self@gmail.com&password=password".data(using: String.Encoding.utf8)
    request.httpBody = data
    
    let dataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
    
        if error != nil {
    
            //handle error
        }
        else {
    
            let jsonStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
            print("Parsed JSON: '\(jsonStr)'")
        }
    }
    dataTask.resume()
    

    最近为Swift 5更新;感谢用户 SqAR.org

        2
  •  4
  •   Christos Chadjikyriacou    9 年前

    我为一个项目创建了一个函数,使用正确的参数,您可以发布、放置和获取

    private func fetchData(feed:String,token:String? = nil,parameters:[String:AnyObject]? = nil,method:String? = nil, onCompletion:(success:Bool,data:NSDictionary?)->Void){
    
        dispatch_async(dispatch_get_main_queue()) {
            UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    
            let url = NSURL(string: feed)
            if let unwrapped_url = NSURL(string: feed){
    
                let request = NSMutableURLRequest(URL: unwrapped_url)
    
                if let tk = token {
                    let authValue = "Token \(tk)"
                    request.setValue(authValue, forHTTPHeaderField: "Authorization")
                }
    
                if let parm = parameters{
                    if let data = NSJSONSerialization.dataWithJSONObject(parm, options:NSJSONWritingOptions(0), error:nil) as NSData? {
    
                        //println(NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: nil))
                        request.HTTPBody = data
                        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                        request.setValue("\(data.length)", forHTTPHeaderField: "Content-Length")
                    }
                }
    
                if let unwrapped_method = method {
                    request.HTTPMethod = unwrapped_method
                }
    
                let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
                sessionConfiguration.timeoutIntervalForRequest = 15.0
                let session = NSURLSession(configuration: sessionConfiguration)
                let taskGetCategories = session.dataTaskWithRequest(request){ (responseData, response, error) -> Void in
    
    
    
                    let statusCode = (response as NSHTTPURLResponse?)?.statusCode
                    //println("Status Code: \(statusCode), error: \(error)")
                    if error != nil || (statusCode != 200 && statusCode != 201 && statusCode != 202){
                        onCompletion(success: false, data:nil)
    
                    }
                    else {
                        var e: NSError?
                        if let dictionary = NSJSONSerialization.JSONObjectWithData(responseData, options: .MutableContainers | .AllowFragments, error: &e) as? NSDictionary{
                            onCompletion(success:true,data:dictionary)
    
                        }
                        else{
                            onCompletion(success: false, data:nil)
                        }
                    }
                }
    
                UIApplication.sharedApplication().networkActivityIndicatorVisible = false
                taskGetCategories.resume()
            }
        }
    }
    

    以下是如何使用函数:

        fetchData(feed,token: Constants.token(), parameters: params, method: "POST", onCompletion: { (success, data) -> Void in
                if success { //Code after completion} })
    
    • 饲料->这是到服务器的链接
    • 令牌(可选)->出于安全目的,某些请求需要令牌
    • 参数(可选)->这些是您可以传递给服务器的所有参数。(顺便说一下,这是一本词典)
    • 方法(可选)->在这里,您可以选择所需的请求类型(“GET”、“POST”、“PUT”)
    • 完井关闭->这里传递一个函数,该函数将在请求完成时执行。在闭包中,您会得到两个参数:“success”是一个布尔值,表示请求是否成功,以及“data”。这是一个包含所有响应数据的字典。(可能为零)

    希望我帮了忙。对不起我的英语

        3
  •  0
  •   chrissukhram    9 年前

    你可以使用雨燕 NSMutableURLRequest 以便进行POST请求。

    Swift GET示例:

    let requestURL = NSURL(string:"urlhere")!
    
    var request = NSMutableURLRequest(URL: requestURL)
    request.HTTPMethod = "GET"
    
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request, completionHandler:loadedData)
    task.resume()
    

    文档POST示例:

    NSString *bodyData = @"name=Jane+Doe&address=123+Main+St";
    
    NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.apple.com"]];
    
    // Set the request's content type to application/x-www-form-urlencoded
    [postRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    
    // Designate the request a POST request and specify its body data
    [postRequest setHTTPMethod:@"POST"];
    [postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]];
    

    这在objective-c中,但很容易转换为swift。

    文档: https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-SW4

        4
  •  -1
  •   budiDino    4 年前

    易于理解的 雨燕5 GET请求:

    let params = "param1=something&param2=whatever".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
    let task = URLSession(configuration: .default).dataTask(with: URLRequest(url: URL(string: "https://web.com/test.php?\(params)")!))
    task.resume()