当前位置: 首页 > 知识库问答 >
问题:

带参数的快速获取请求

公良飞尘
2023-03-14

我对swift非常陌生,所以我的代码中可能会有很多错误,但我试图实现的是向带有paramters的本地主机服务器发送get请求。更重要的是,我试图实现它,因为我的函数接受两个参数baseurl:string,params:nsdictionary。我不确定如何将这两者结合到实际的URLRequest中?以下是我到目前为止所尝试的

    func sendRequest(url:String,params:NSDictionary){
       let urls: NSURL! = NSURL(string:url)
       var request = NSMutableURLRequest(URL:urls)
       request.HTTPMethod = "GET"
       var data:NSData! =  NSKeyedArchiver.archivedDataWithRootObject(params)
       request.HTTPBody = data
       println(request)
       var session = NSURLSession.sharedSession()
       var task = session.dataTaskWithRequest(request, completionHandler:loadedData)
       task.resume()

    }

}

func loadedData(data:NSData!,response:NSURLResponse!,err:NSError!){
    if(err != nil){
        println(err?.description)
    }else{
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
        println(jsonResult)

    }

}

共有1个答案

皇甫礼骞
2023-03-14

在构建get请求时,没有请求的正文,而是所有内容都在URL上进行。要构建URL(以及正确的百分比转义),还可以使用urlcomponents

var url = URLComponents(string: "https://www.google.com/search/")!

url.queryItems = [
    URLQueryItem(name: "q", value: "War & Peace")
]

唯一的诀窍是,大多数web服务需要+字符百分比转义(因为它们会将其解释为application/x-www-form-urlencoded规范规定的空格字符)。但是urlcomponents不会对其进行百分比转义。Apple认为+是查询中的有效字符,因此不应该转义。从技术上讲,它们是正确的,在URI查询中允许这样做,但是在application/x-www-form-urlencoded请求中有特殊的含义,并且不应该不转义地传递。

Apple承认我们必须对+字符进行百分比转义,但建议我们手动转义:

var url = URLComponents(string: "https://www.wolframalpha.com/input/")!

url.queryItems = [
    URLQueryItem(name: "i", value: "1+2")
]

url.percentEncodedQuery = url.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")

这是一个不优雅的解决方案,但它是有效的,如果您的查询可能包含+字符,并且您有一个将它们解释为空格的服务器,苹果就会建议您这样做。

因此,将其与SendRequest例程结合起来,您将得到如下内容:

func sendRequest(_ url: String, parameters: [String: String], completion: @escaping ([String: Any]?, Error?) -> Void) {
    var components = URLComponents(string: url)!
    components.queryItems = parameters.map { (key, value) in 
        URLQueryItem(name: key, value: value) 
    }
    components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
    let request = URLRequest(url: components.url!)
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard
            let data = data,                              // is there data
            let response = response as? HTTPURLResponse,  // is there HTTP response
            200 ..< 300 ~= response.statusCode,           // is statusCode 2XX
            error == nil                                  // was there no error
        else {
            completion(nil, error)
            return
        }
        
        let responseObject = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
        completion(responseObject, nil)
    }
    task.resume()
}
sendRequest("someurl", parameters: ["foo": "bar"]) { responseObject, error in
    guard let responseObject = responseObject, error == nil else {
        print(error ?? "Unknown error")
        return
    }

    // use `responseObject` here
}
 类似资料:
  • 我正在使用Alamofire4和Swift3构建一个网络堆栈。根据Alamofire指南,我为服务的endpoint创建了一个路由器。我目前正在使用OpenWeatherMap的免费API,但我发现创建get请求时存在问题。这就是所需的url:http://api.openweatherap.org/data/2.5/weather?q=rome&appid=my_api_key。粘贴在浏览器上,

  • 主要内容:通过 HttpServletRequest 获取请求参数,通过形参获取请求参数,使用 @RequestParam 注解获取,通过实体类对象获取(推荐),解决获取请求参数的乱码问题Spring MVC 提供了多种获取请求参数的方式: 通过 HttpServletRequest 获取请求参数 通过控制器方法的形参获取请求参数 使用 @RequestParam 注解获取请求参数 通过实体类对象获取请求参数(推荐) 下面我们就对这些获取请求参数的方式一一进行介绍。 通过 HttpServlet

  • 问题内容: 我是一个Node.js新手,并且正在用它创建我的第一个大型应用程序(我正在使用Express)。当用户使用get请求加载ID时,我需要让我的网页执行一些javascript画布绘制 我知道我可以用一个简单的方法来处理 但我不知道如何使用该ID的要求的图纸开始我的网页。互联网上Express和Get上的每个教程都说明了如何处理get请求…这个问题是关于“接下来会发生什么?” 改写:我不确

  • 问题内容: 下载数据时,有什么方法可以迅速取得进展? 下载数据时,我需要显示进度栏。 问题答案: 您可以使用此代码通过进度条及其委托功能来显示下载过程。

  • 问题内容: 我正在尝试在iOS 8中针对SWIFT中的Objective-C 实现答案 我打电话给 这将导致“致命错误:在展开可选值时意外发现nil” 问题答案: 试试这个代码: