我们希望发出HTTP(S)请求(GET)来调用API。问题是,NSURLRequest(目前)尚未在Linux for Foundation(https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSURLRequest.swift)中实现。
还有其他创建HTTP请求的可能性吗?
答案 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上的技术不成熟,也可能会出现其他令人不快的意外。
然而,如果这只是一个好奇心和学习的问题,这里有一些想法,即使我自己没有尝试过:
无论您采用哪种方法,都需要与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中的.responseObject
和JSONDecodable
作为示例。)
答案 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()
}
}