没有NSURLRequest的Swift中的HTTP请求

时间:2016-01-25 16:12:06

标签: linux swift httprequest

我们希望发出HTTP(S)请求(GET)来调用API。问题是,NSURLRequest(目前)尚未在Linux for Foundation(https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSURLRequest.swift)中实现。

还有其他创建HTTP请求的可能性吗?

5 个答案:

答案 0 :(得分:5)

有一个名为 HTTPMiddleware 的好项目可能很有用,它只是一个中间件框架,但效果很好。

这是一个代码示例:

import HTTP
import HTTPMiddleware

struct Middleware: HTTPRequestMiddlewareType {
    func respond(request: HTTPRequest) -> HTTPRequestMiddlewareResult {
        // You can change the request and pass it forward
        return .Next(request)

        // Or you can respond early and bypass the chain
        return .Respond(HTTPResponse(statusCode: 404, reasonPhrase: "Not Found"))
    }
}

struct Responder: HTTPResponderType {
    func respond(request: HTTPRequest) -> HTTPResponse {
        // May or may not be called depending on the middleware
        return HTTPResponse(statusCode: 200, reasonPhrase: "OK")
    }
}

let request = HTTPRequest(method: .GET, uri: URI(path: "/"))
let chain = Middleware() >>> Responder()
let response = chain.respond(request)

以下是官方page,您还可以在源代码中找到可用于常见请求的 JSON 解析器。 安装只需要 uri_parser

答案 1 :(得分:2)

考虑到Linux上的Swift是快速发展的工作正在进行中,我认为最好的方法是在情况更稳定之前推迟任何认真的开发。即使您克服了发出HTTP请求的障碍,由于Linux上的技术不成熟,也可能会出现其他令人不快的意外。

然而,如果这只是一个好奇心和学习的问题,这里有一些想法,即使我自己没有尝试过:

  • 也许可以直接调用CoreFoundation C API。
  • 使用优秀的旧C网络API编写一个C包装器,它提供您需要的接口。这种方法可能需要比其他方法更多的努力,因为你将重新发明许多轮子。
  • 编写一个C包装器,但包装一个使用URL的更高级别的C库;想到了libcurl。

无论您采用哪种方法,都需要与C代码进行交互。一种方法是使用系统模块,请参阅Importing a Swift module using a C library作为可能的起点。

答案 2 :(得分:2)

考虑以下基于ccurl库的解决方案:

https://dl.dropboxusercontent.com/u/2504173/CurlSampleApp.tar.gz

我是在Ubuntu 14.04上做到的

Swift 3.0 - 最新开发版本: https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a-ubuntu14.04.tar.gz

以下包装和说明一般工作正常:

https://swiftpkgs.ng.bluemix.net/package/SwiftOnTheServer/CCurl

但是为了修复编译错误,我不得不在CCurl包中修改sots_curl.h。以下行添加了:

#include <stdint.h>

对于应用程序构建,您需要在app文件夹中执行以下操作:

swift build

对于app运行,您需要在app文件夹中执行以下命令:

.build/debug/app

希望它有所帮助。提出问题,如果有的话:))

答案 3 :(得分:1)

自2017年中期以来,IBM的SwiftyRequest库可以在Linux和iOS上运行。我已经在Linux上尝试了它,似乎工作正常。

提出请求看起来像这样(改编自docs的示例):

import SwiftyRequest

let request = RestRequest(method: .get, url: "http://myApiCall/hello")
request.responseString() { response in
    switch response.result {
    case .success(let result):
        print("Success")
    case .failure(let error):
        print("Failure")
    }
}

如果你正在使用JSON作为响应,它甚至可以构建一个基于&#34; schema&#34;的对象。您提供(请查看tests中的.responseObjectJSONDecodable作为示例。)

答案 4 :(得分:0)

不是完整的答案,但可能对某人有用:

我只需要NSData(contentsOfURL: NSURL)所以我最终为KituraNet编写了一个封装器。我只是检查是否有数据并返回。

由于NSURL远未完全实现,我还决定暂时将该网址作为String传递。

它不是NSURLRequest的替代品,只是NSData(contentsOfURL: NSURL)

的便利性
.Package(url: "https://github.com/IBM-Swift/Kitura-net.git", majorVersion: 0, minor: 15),
import KituraNet

extension NSData {

  public static func contents(ofUrl urlString:String, completionHandler:((data:NSData?) -> Void)) {

    let request = HTTP.request(urlString) { (response) in

      guard let response = response else {
        completionHandler(data: nil)
        return
      }

      let responseData = NSMutableData()
      do {
        try response.readAllData(into: responseData)
        completionHandler(data: responseData)
        return
      } catch {
        completionHandler(data: nil)
        return
      }
    }
    request.end()
  }
}