如何使用swift 3进行同步url请求

时间:2016-10-24 12:45:18

标签: swift3 alamofire vapor kitura

我知道之前已经问过这个问题并且我同意大多数答案,他们声称最好遵循Swift 3中与URLSession异步请求的方式。我有以下情况,其中不能使用异步请求。< / p>

使用Swift 3并且能够在服务器上运行swift我有以下问题。

  1. 服务器接收来自客户端的请求
  2. 要处理请求,服务器必须发送网址请求并等待响应到达。
  3. 一旦响应到来,处理它并回复客户
  4. 问题出现在第2步中,其中URLSession使我们能够仅启动异步数据任务。大多数(如果不是全部)服务器端swift Web框架不支持异步响应。当请求到达服务器时,一切都必须在同步事件中完成,最后发送响应。

    到目前为止,我找到的唯一解决方案是使用DispatchSemaphore(参见最后的示例),我不确定这是否适用于扩展环境。

    任何帮助或想法都将不胜感激。

     select ...
            case
              when (Age < 65) then
                case 
                  when (Income >= 0) or (Income <= 1880000) then
                    income * 52 
                  when (other condition) then
                    --TODO: compute other condition amount - "calculate it amnt"
                  else
                    --TODO: compute amount here 
                end  
              else
                --TODO: return right value here
            end as amnt
            ...
       from MyTable(s)
    

    我只有kitura web框架的经验,这是我遇到问题的地方。我想在所有其他swift Web框架中都存在类似的问题。

2 个答案:

答案 0 :(得分:2)

在Vapor中,您可以使用Droplet的客户端发出同步请求。

let res = try drop.client.get("https://httpbin.org")
print(res)

此外,您可以使用Portal类使异步任务同步。

let res = try Portal.open { portal in
    asyncClient.get("https://httpbin.org") { res in
        portal.close(with: res)
    }
}

答案 1 :(得分:2)

你的三步问题可以通过使用完成处理程序来解决,即一个回调处理程序和一个Node.js约定:

import Foundation
import Kitura
import HeliumLogger
import LoggerAPI

let session = URLSession(configuration: URLSessionConfiguration.default)

Log.logger = HeliumLogger()

let router = Router()

router.get("/test") { req, res, next in
    let datatask = session.dataTask(with: URL(string: "http://www.example.com")!) { data, urlResponse, error in
        try! res.send(data: data!).end()
    }

    datatask.resume()
}

Kitura.addHTTPServer(onPort: 3000, with: router)
Kitura.run()

这是对您的问题的解决方案的快速演示,它绝不是遵循最佳的Swift / Kitura实践。但是,通过使用完成处理程序,我可以让我的Kitura应用程序进行HTTP调用以获取http://www.example.com处的资源,等待响应,然后将结果发送回我应用程序的客户端。 / p>

指向相关API的链接:https://developer.apple.com/reference/foundation/urlsession/1410330-datatask