Linux Swift中的HTTP请求,无NSURLRequest
我们希望发出HTTP(S)请求(GET)来调用API。问题是,NSURLRequest(目前)没有在Linux(…)/的基础上实现。Linux Swift中的HTTP请求,无NSURLRequest,linux,swift,httprequest,Linux,Swift,Httprequest,我们希望发出HTTP(S)请求(GET)来调用API。问题是,NSURLRequest(目前)没有在Linux(…)/的基础上实现。 还有其他创建HTTP请求的可能性吗?考虑到Linux上的Swift正在快速发展,我认为最好的方法是推迟进行任何认真的开发,直到情况更加稳定。即使您克服了发出HTTP请求的障碍,也可能会有其他令人不快的惊喜,因为Linux上的技术还不成熟 然而,如果这只是好奇和学习的问题,以下是一些想法,尽管我自己没有尝试过: 也许直接调用CoreFoundation C API
还有其他创建HTTP请求的可能性吗?考虑到Linux上的Swift正在快速发展,我认为最好的方法是推迟进行任何认真的开发,直到情况更加稳定。即使您克服了发出HTTP请求的障碍,也可能会有其他令人不快的惊喜,因为Linux上的技术还不成熟 然而,如果这只是好奇和学习的问题,以下是一些想法,尽管我自己没有尝试过:
- 也许直接调用CoreFoundation C API会奏效
- 使用好的旧C网络API编写一个C包装器,它提供您需要的接口。这种方法可能比其他方法需要更多的努力,因为您将重新发明许多轮子
- 编写一个C包装器,但包装一个更高级别的C库,该库可以处理URL;我想到了libcurl
无论采用哪种方法,都需要与C代码接口。一种方法是使用系统模块,请参阅作为可能的起点 有一个很好的项目叫做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)
这是官方的,您还可以在源代码中找到一个对常见请求有用的JSON解析器。
安装只需要uri\u解析器基于ccurl库考虑以下解决方案: 我是在Ubuntu 14.04上做的 Swift 3.0-最新开发版本: 以下包装和说明通常效果良好: 但为了修复编译错误,我不得不修改CCurl包中的
sots_curl.h
。添加了以下行:
#include <stdint.h>
要运行应用程序,您需要在应用程序文件夹中执行以下命令:
swift build
.build/debug/app
希望能有帮助。如果有问题,请提问:)不是完整的答案,但可能对某人有用: 我只需要
NSData(contentsOfURL:NSURL)
,因此我最终为KiturNet编写了一个包装器,该包装器使用闭包实现这一点。我只是检查是否有数据并返回
由于NSURL
还远未完全实现,我还决定暂时将url作为字符串传递
它不是NSURLRequest
的替代品,只是NSData(contentsOfURL:NSURL)的便利性
自2017年年中起,IBM的library就开始在Linux和iOS上运行。我在Linux上试用过,似乎效果不错
发出请求如下所示(改编自文档中的示例):
如果您使用JSON进行响应,它甚至可以基于您提供的“模式”为您构造一个对象(请查看示例中的.responseObject
和JSONDecodable
。感谢您的详细回答。你是对的,也许最好的答案是等待。一个c模块可以是一个选项,也许有一个易于使用的api。IBM有一个用于curl的swift包。我只是不知道如何让它做一个简单的get请求。我真的想知道为什么没有一个带有文档的Swift包。如果你看一下golang,你会很难找到一个没有完整文档的。不管怎样,我会试试这个,然后再给你回复。它只有swift 2.2版本,已经6个月没有活动了。所以不再有用了。我收到的100多个构建错误表明它不。。。很抱歉,对于生产软件来说,只有Swift 2.2版本且在6个月内未更新的软件包不是一个好的选择。很抱歉,您使用的是什么Swift版本?实际上swift 2.2总是比较稳定的,你有旧版本吗?你的发行版是什么?Swift发布:你现在在官方页面上看不到任何活动,因为没有发现任何问题。我已经将我在Swift for linux中所做的一切都归档了。我当前的基本图像是ibmcom/swift ubuntu:latest
。如果我没弄错的话,它使用Swift 3.0并运行Ubuntu15。在我的主机上,我使用官方的swift 2.2运行OSX,我现在正在尝试它是CCurl的包装器,即使示例代码不好,如果您修改它以编译它,它也会运行得非常好。
.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()
}
}
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")
}
}