Tag: 服务器端Swift

使用HTTPS轻松保护您的完美服务器端Swift代码

作为软件开发人员,我们应该做的最关键的事情之一就是确保我们管理的数据是安全的,第一步应该始终是强制执行SSL加密。 这意味着任何访问您的API或老实说您的网站的人都应该使用HTTPS通过端口443对其进行访问,并在其浏览器中获得一个漂亮的封闭锁符号。 因此,在本文中,我将向您展示启动使用LetsEncrypt证书同时适用于端口80上的未加密流量和端口443上的加密流量的服务器的简单性。 首先,我从Perfect Assistant创建的全新AWS实例开始,所以我知道它拥有所有正确的功能。 接下来,我要查看https://certbot.eff.org/#ubuntuxenial-other来安装LetsEncrypt Certbot。 这将使我们轻松创建和验证证书。 按照说明进行以下操作: $ sudo add-apt-repository ppa:certbot / certbot $ sudo apt-get更新 $ sudo apt-get install certbot 在安装过程中,我将回到Perfect Assistant,并为Perfect Template制作一个新的克隆。 这将为我提供所有需要的东西的一个文件开始。 一旦克隆并构建了Xcode项目,我们将对模板的main.swift文件进行一些操作。 目前的模板具有1个HTML路由和2个“服务器”,但是我们想用2个稍有不同的服务器替换“ handler”功能。 //此“处理程序”功能用于端口80。 func handler80(data:[String:Any])抛出-> RequestHandler { 返回{ 请求,回应 response.appendBody(string:“ 你好,世界! 你好,世界!端口80 ”) response.completed() } } //此“处理程序”功能用于端口443。 func handler443(data:[String:Any])抛出-> RequestHandler { 返回{ 请求,回应 response.appendBody(string:“ 你好,世界! 你好,世界!端口443 ”) […]

教程:如何使用Leaf

还可以学习叶子-一种可轻松生成视图的模板语言! 您可以在github上找到本教程的结果 本教程是如何设置Vapor 3项目的自然后续。 您可以先阅读该教程然后再回来,也可以跳过并继续阅读😊 指数 1.创建一个新项目 2.生成Xcode项目 3.配置您的项目以使用Leaf 4.创建您的第一个模板/视图 5.实施服务视图的路线 6.奖金:将数据传递到视图 7.从这里去哪里 1.创建一个新项目 蒸气工具箱非常好,让您可以使用任何git-repo作为模板轻松创建新项目。 由于我们将基于上述教程的结果,因此我们将使用它作为模板来创建一个新项目: 蒸气新项目名称–template = vaporberlin / my-first-route 注意:您可以通过在终端中输入vapor –help来查看蒸气工具箱的全部功能。 我们的命令将使用来自vaporberlin的 my-first-route作为模板创建一个名为projectName的项目(感谢vapor toolbox🤛🏻)。 2.生成Xcode项目 在生成Xcode项目之前,我们必须添加Leaf作为依赖项,并在Package.swift中更改包名称: // swift-tools-version:4.0 导入PackageDescriptionlet包=包( 名称:“ projectName”,//已更改 依赖项:[ .package(URL:“ https://github.com/vapor/vapor.git”,来自:“ 3.0.0”), .package(URL:“ https://github.com/vapor/leaf.git”,来自:“ 3.0.0”)//添加 ], 目标:[ .target(name:“ App”,依赖项:[“ Vapor”, “ Leaf” ]), .target(name:“ Run”,依赖项:[“ App”]), .testTarget(name:“ AppTests”,依赖项:[“ App”]), ] […]

夏休みの思い出にVaporでAPIを作ってみた

Qiita Pocketという先日リリースした自作iOSアプリで,どうしてもアプリ用のAPIが必要になり,Server-Side-Swift(以降,SSS)フレームワークのVaporを使ってみました。 SSS楽しいよ!というお话しです。 自作APIが必要になった経纬 もともとの自作iOSアプリ要件はこんな感じでした。 Qiitaの投稿のストック数ランキングが见れる 周间ランキングが见れる 月间ランキングが见れる タグでフィルタしたランキングが见れる API実装前のアプリは,アプリだけ作だけQiitaから提供されているAPIをコールしてストック数を元にランキングを生成するだけでした。 がかかりすぎてので,月间のランキングをその场で取得しようとすると时间がかかりすぎて3.の要件を断念していました。 また,旧アプリはAPIのv1を使っていたのですが,Qiitaからv1のAPIサポートが9月に终了する告があり,v2に切り替えたところ,1APIで取得できた投稿のストック数が2API(投稿取得->投稿のストック数取得)コールせねば取れず、、 层。API层作るしかねぇと思い,APIを作ることにしました。 (まだ开発中ですが,リポジトリはこちら) hirothings / qiita-pocket-API 通过在GitHub上创建一个帐户为qiita-pocket-API开发做出贡献。 github.com なぜ蒸气? uelともとSwiftは书けるけど,サーバーサイドは过去ドはFuelPHPを少し触ったのとProgateでRailsの讲座を终えた程度の初心者だったので,この际何やっても同じなら惯れた惯れた言语のSwiftでやってみようと决断。 SSSのフレームワークは,PerfectとVaporのスター数が串联抗しているのですが,VaporはToolboxというコマンドセットでHerokuへのデプロイが可能なので,Vaporにしました。(环境の构筑にお金と时间をかけたくなかった) 実装した机能 DB作成(sqlite3) 型号作成 模特の1対多のリレーション ルーティング Qiita APIにHTTPリクリスト 限价服务を超えないようにインターバルを空けてリクエスト 模特に対してクエリの発行(タグでフィルタ,期间でフィルタ) 型号をJSONエンコード herokuにデプロイ 蒸气の良いところ 可能とんどの机能がデフォルトのパッケージで実装可能 実际,上记の実装のうち,追加のパッケージが必要だったのは「6。 速率限制。 斯威夫特で书ける これは当たり前ですが,Swiftの良いところを生かしてコードが书けるようにフレームワーク自体が设计されてます。 例えばModelオブジェクトのコード 最终课程文章:模型{ var storage:存储= Storage() 静态让idType:IdentifierType = .int 让标题:字符串 让itemID:字符串 让发布时间为:日期 让profileImageURL:字符串 让网址:字符串 var stockCount:Int = […]

服务器端Swift:制作机盖(3/6)

上周,我谈到了如何选择Perfect作为Canopy服务器的基础。 本周,我将讨论云提供商,Linux上的Swift,开发过程和部署。 什么是天篷? 现在输入swift run将运行您的服务器。 我建议您使用Xcode,但是要执行这种类型的swift package generate-xcodeproj ,您将获得一个Xcode项目,该项目将在您R时运行您的服务器。 在开发过程中,您需要在Mac上运行服务器应用程序的本地实例,并使您的应用程序与此相对应。 这大大减少了调试周期。 就像我在本系列的第1部分中所说的那样,如果您有一个用于客户端和服务器的项目,则可以共享代码并降低Rev-lock的严重性。 但是,您不可避免地要部署这些开发版本,并且使用rsync很容易: 该脚本将源与服务器同步,构建应用程序,然后要求systemd重新启动它。 在脚本中,我使用了foo ,在其中您可以将foo更改为.ssh/config服务器的名称。 下周我将讨论systemd和其他生产问题。 值得注意的是,使用最便宜的实例编译代码将花费很多时间。 也许有足够的理由升级您的实例,或者直接进入本地交叉编译,接下来我将讨论这些选项。 在某个时候,您将决定现在的时间:上线的时间! 生产似乎很可怕,但实际上您只需要做好准备。 此时,您需要进行大量练习,并且您会非常了解自己的应用及其代码,因此对自己有信心。 首先为您的用户配置密码,以便sudo要求输入密码(默认情况下, sudo AWS实例不提供密码) 您应该在本地或Docker Ubuntu实例上设置交叉编译,以便可以在本地构建应用程序,然后将其scp到您的服务器。 现在,您可以删除服务器上的Swift,并将远程软件包安装减少到最低限度。 Swift二进制文件需要一些内容,尤其是libicu和libcurl才能保留。 我发现由于SwiftPM团队做出了许多奇怪的决定,导致交叉编译不起作用:特别是#if os(Linux)在Package清单中不起作用,事实证明我的依赖关系图充满了此类声明。 我理解为什么有这些陈述: 这是一种语言功能 。 我不明白为什么苹果公司决定在Package.swift文件中不支持此语言功能 。 相反,他们打算强迫用户指定平台作为清单声明的一部分。 海事组织,这可能会使每个地方平台规范(即DSL每个子部分的每个子部分)肿,这将需要数年(基于当前进展),这意味着该功能将无法使用(因此强制#if os因为还没有其他选择)。 毕竟,#if os仍然更加灵活。 SwiftPM团队为什么要与这种语言作斗争 ? 你告诉我。 总而言之,我别无选择,只能使用Docker实例来构建我的Linux二进制文件,因为SwiftPM无法交叉编译我的依赖图。 幸运的是,Docker可以正常工作。 您可以使用简单的脚本在本地进行构建,使用scp二进制文件并调用systemctl restart foo来重新启动服务器应用程序。 请注意,指定–static-swift-stdlib进行swift build否则生成的二进制文件在未安装Swift的情况下将无法工作(严格来说,如果没有LD_PATH中的libswift.so和libFoundation.so ,它将无法工作)。 另外,不要忘记使用发行版优化( -c release […]

创建GitHub Pull Request的简单指南

作为像Perfect这样的免费开源软件项目,最大的挑战是如何在保持质量和凝聚力的同时,使社区参与。 作为项目“核心”团队的成员,我们经常离代码很近,看不到极端情况,也没有考虑到我们尚未遇到的情况-在这里使用库的人会遇到问题,错误,或优化机会对于​​项目的成熟至关重要。 幸运的是,git(在我们的特定情况下为GitHub)使用称为“请求”的流程使社区贡献变得容易。 “我很乐意为此做一个请求请求,但我不知道该怎么做” 在我们关于开放社区Slack组的日常讨论中,当被告知有关文档或代码更改的需求时,有人多次评论“我很乐意为此提出请求,但我不知道该怎么做”。 。 好吧,如果您曾经说过或曾经想过并且犹豫要为FOSS项目做出贡献,请继续阅读! 什么是“拉取请求” “拉取请求”这个术语有点奇怪,除了可能有“补丁”的概念外,它与git社区以外的任何事物都不能很好地等同。 实际上,拉取请求(也称为PR)是您提交代码更改同时促进公开对话和审阅的一种方法。 PR的简单解释是: 您可以修改自己的git存储库副本 一旦感到满意, 就会触发一个请求,将您的更改合并到原始存储库中,并说明您的操作以及原因 然后,项目管理员会查看您的更改并接受更改 ,或者就更改进行讨论。 实际中的拉取请求 为了逐步演示您作为读者的身份如何进行PR,我将描述对Perfect Documentation资源库进行PR的过程。 Perfect项目的整个文档集都是开源的,我们会定期更新主站点上的HTML版本-从GitHub存储库的Markdown文件生成。 这意味着,如果发现拼写错误或可以做出的改进,那么您将有能力提供帮助! 因此,我今天注意到CouchDB驱动程序文档中提到的版本不正确:它引用的majorVersion为0,应为1。 回到源代码的GitHub回购页面https://github.com/PerfectlySoft/PerfectDocs/blob/master/guide/CouchDB.md,我可以看到它也已经过时了,因此需要更改。 第一步,“分叉”存储库。 哇,更多git术语:“ fork”是在特定时间点故意创建的版本库。 想象一下,如果您沿着森林步道走,突然之间的路径被分成两部分,这就是“叉子”。 一个路径可能会继续到达预期的目的地,而另一条路径可能会将您带向完全不同的方向……有时会合并回到原始路径中。 “叉子”是在特定时间点故意创建的版本库的新版本。 要创建Perfect文档存储库的分支,请使用GitHub页面右上方的“ Fork”按钮。 然后,您会看到一个对话框,询问您要将新叉子放置在何处。 选择一个位置:您的列表可能比我的列表更短或更长时间…… 现在我们有了自己的fork,可以编辑文件了。 编辑并提交更改 对于我们将要进行的小更改,GitHub用户界面使操作变得简单。 对于更广泛的更改(尤其是涉及代码),建议将新的存储库克隆到本地环境,并在提交之前使用Xcode之类的IDE来编辑和测试代码。 看到此演示正在更改文档的一小部分,我将直接在GitHub UI中进行编辑。 在页面上以自己的仓库查看文件时,您会看到一个铅笔图标,用于进入编辑模式: 单击此按钮将使您进入编辑模式。 滚动到要更改的位置-在我的情况下,我想将“ 0”更新为“ 1”。 完成更改后,向下滚动至页面的“提交消息”部分,然后输入有关更改内容的简短说明: 现在,此更改仍在您的文档存储库副本(分叉)上,因此下一步是将路径重新组合在一起。 提交您的拉取请求 当查看分叉存储库的“根”(也显示自述文件的根)时,您将看到一个标有“新请求请求”的按钮。 单击此按钮将带您进入一个页面,该页面专门向您显示您的版本与父版本之间的所有差异。 它还会通知您是否存在任何妨碍成功的合并冲突。 单击绿色的大按钮“创建请求”,然后您可以借此机会总结在PR中所做的所有更改。 现在单击“创建请求请求”将在父资源库中向您显示可公开查看的PR条目。 请注意,有一个橙色的“ CLA助手”注释,以及一条消息“某些检查尚未完成”…… 该“ […]

蒸气与Kitura基准测试

IBM-Swift团队的Chris Bailey最近在Swift London上发表的讲话显示了服务器端Swift的有趣基准图。 我对这些结果感到非常惊讶,因此我针对最新的Vapor(0.15),最近一次针对性能的版本(0.11)和针对Kitura(0.24)的Vapor’s Engine(在Vapor 0.15中使用0.4)运行了一些本地基准测试。 结果表明,Vapor的最新性能版本击败Kitura,而最新版本则落后5%。 在IBM-Swift的图表中看不到40%的领先优势。 此外,可以说与Kitura更具可比性的Vapor Engine具有领先优势。 IBM的测试可能正在发现Vapor的弱点,但由于IBM的结果中未包含确切的环境和基准,因此我们很难知道。 如果有人了解环境和过程的详细信息,请发表评论,以便我们改进调优! 结果 与往常一样,这是本文中运行的基准测试的深入细节和结果。 机 蒸气(0.11) Gertrude:〜tanner $ wrk -d 10 -t 4 -c 8 http:// localhost:8080 / plaintext 运行10s测试@ http:// localhost:8080 / plaintext 4个线程和8个连接 线程统计平均值Stdev Max +/- Stdev 延迟438.06us 97.97us 5.03ms 84.30% 要求/秒4.53k 140.02 5.04k 70.79% 182307个请求的读取时间为10.10秒,已读取25.91MB 请求/秒:18050.53 传输/秒:2.56MB 蒸气(0.15) Gertrude:〜tanner $ wrk -d […]

Slimane服务器端Swift

这是我在Medium上的第一个帖子。 什么是Slimane? 一个明确的启发性的Swift3微型框架和HTTP服务器。 https://github.com/noppoMan/Slimane 在对其进行介绍之前,我可以花一点时间讲讲故事为什么开始吗? 首先,在我的工程生涯中,我将大部分时间用于基础架构,后端,数据分析和Web开发。 所以我对Swift(尤其是iOS和Cocoa)的经验不足。 但是在2015年3月,我有机会为LifeClips(类似Blogging平台的中型平台)构建了一个iOS应用,然后我第一次使用Swift。 很快,我就爱上了Swift语法,例如强大的类型系统和足以与LL进行比较的灵活性。 迅速成为OSS 时间流逝…终于在2015年12月成为开源。然后我想我应该做点什么,那就是Slimane。 首先,这只是我的业余爱好。 尽管是业余爱好,但我每天都在做很多现代Web系统所需的功能/模块,有一天我意识到它可以在实际的Project中使用…(我正在等待Swift3发布) 特征 100%与事件循环后端(libuv)异步 独立的HTTP服务器 快点 模块化的 完全托管的异步流,TCP,管道,文件系统,进程,计时器等。 采用开放式快速 可用的中间件和模块 WS :Websoket服务器/客户端 衣架 :异步HTTP客户端 画眉 :轻量级的承诺实现 QWFuture :将来通过uv_queue_work实现 会话 :SessionMiddleware在Slimane应用中启用会话。 Redis :用于会话的Redis客户端和Redis存储 BodyParser :用于在HTTP请求的主体中解析JSON和formData。 TemplateEngine:小胡子和javascript模板 还有更多…https://github.com/slimane-swift 入门 目的是建立一个快速的服务器并尝试使用一些示例。 不用担心,您无需编写任何代码。 试试看! 安装 按照安装指南设置机器。 https://github.com/noppoMan/Slimane/wiki/Install-Guide 生成并启动服务器和应用程序 cd / path / to / your / slimane-example 进行调试 […]

使用Kitura的Server Side Swift入门

服务器端Swift在iOS开发社区中正在蓬勃发展,现在是时候打破其他编程语言和框架的束缚,并以我们心爱的Swift语言实现一切。 有几种服务器端Swift框架可用,但最受欢迎的三个框架如下: 汽 Kitura 完善 有时我介绍了Vapor框架。 这篇文章讨论了如何开始使用Kitura,Kitura是IBM的服务器端Swift框架。 先决条件: Xcode 8或以上 斯威夫特3.0 使用Swift Package Manager安装Kitura软件包: 第一步是使用Swift Package Manager安装Kitura软件包。 在此之前,您需要初始化Swift Package Manager。 创建一个名为“ hello-kitura”的文件夹,然后使用终端进入该文件夹。 一次,在文件夹中初始化Swift软件包,如下所示: 运行“ swift build”命令来构建代码,如下所示: 构建完成后,您可以使用以下命令运行可执行文件。 世界您好! 当您执行代码时,它将在“ main.swift”中运行所有代码。 如果打开“ main.swift”文件,则会发现以下代码行。 打印(“ Hello World”) 这确认您的包已成功初始化。 现在打开您的Package.swift文件,其中包含您需要在应用程序中使用的所有软件包。 默认情况下,Package.swift将包含以下代码行。 导入PackageDescription 让包=包( 名称:“ hello-kitura” ) 如此,您可以看到Package.swift文件没有引用任何包或依赖项。 让我们对其进行修复,并添加对Kitura项目的依赖。 除了Kitura,我们还添加了对HeliumLogger的依赖。 HeliumLogger用于记录从Kitura生成的事件,对调试请求非常有帮助。 对Package.swift文件进行上述更改后,跳至终端并运行以下命令。 快速构建 这将触发构建并下载Package.swift文件中包含的所有依赖项。 一切完成后,您可能会看到类似以下内容的内容。 最后一步是生成Xcode项目,以便您可以在自己喜欢的编辑器中开始使用Kitura应用程序🙂 迅捷包generate-xcodeproj 这将生成Xcode项目。 您可以使用以下命令从终端打开Xcode项目。 […]

使用Docker的Swift

我喜欢服务器端开发,也喜欢Swift,因此很显然我对服务器端Swift感兴趣。 但是如果没有Docker,现代的后端开发是不可能的(至少是极其混乱的)。 幸运的是,我们能够在Docker容器中运行Swift应用程序。 Swift的常规Dockerfile通常看起来像: 来自swift:latest 添加。 / app WORKDIR / app 运行快速包解析 RUN快速构建-配置发布EXPOSE 8080 ENTRYPOINT .build / release / SwiftDocker 这是简单明了的示例。 但不幸的是,结果容器将很大,约为1.35G。 这使得处理图像变得困难。 至少我的Mac上只有250G,因此我必须处理此问题。 Docker支持多阶段映像。 当您在一个图像中构建某些内容并将其复制到另一个图像中时。 它提供了在完整映像中构建应用程序的可能性,但仅使用最小映像即可运行它:OS +必要的库。 我总是在Golang应用程序中使用这种技术。 Go编译器能够创建一个包含所有依赖项的可执行文件。 不幸的是,Swift编译器在静态链接标准库和Foundation时存在一些问题。 我在本文“最小化Swift Docker映像”中找到了可能的解决方案。 但是直接从文章解决方案对我没有用。 所以我修改了它。 主要思想是使用ldd确定哪些共享库需要二进制文件并将其压缩到存档中。 #!/ bin / bash BIN =“ $ 1” OUTPUT_TAR =“ $ {2:-swift_libs.tar.gz}” TAR_FLAGS =“ hczvf” DEPS = $(ldd $ […]

Firebase服务器端Swift入门

Firebase工具套件很棒。 在一个屋顶下捆绑了这么多有用的开发服务真是太好了,而且免费上手的能力也很棒! Firebase为多个平台提供SDK,以与其服务(包括iOS)进行通信。 但是,iOS SDK与iOS应用程序生命周期紧密相关,因此无法在服务器端Swift环境中使用。 幸运的是,Firebase提供了REST API,这为我们提供了在Swift中开发服务器时使用其服务的途径。 最近,这篇文章概述了在服务器端Swift环境中开始使用Firebase REST API所需的步骤。 我将把Swift Vapor应用程序连接到Firebase的新Cloud Firestore技术,但是一般过程应适用于任何其他服务器端Swift框架和Firebase服务。 Cloud Firestore Cloud Firestore是Firebase的“新的和改进的” NoSQL云数据库。 与以前的产品Firebase Realtime Database一样,Cloud Firestore在客户端之间实时同步数据,并为脱机模式提供一流的支持。 Cloud Firestore与实时数据库 如果您过去使用过Firebase的实时数据库产品,您可能想知道Cloud Firestore有何不同。 Firebase文档进行了更详细的介绍,但从根本上讲,它可以归结为Firebase,它可以在原始Realtime Database产品成功的基础上进行改进。 较早的实时数据库需要使用非规范化和数据展平技术来防止随着数据库的增长和发展而出现瓶颈。 Cloud Firestore通过提供更丰富,更快的查询和更好的可伸缩性来对此进行改进。 因此,如果Cloud Firestore是Realtime Database的改进版本,那么Realtime Database甚至不再相关吗? 答案是肯定的。 实时数据库的真正优势仍然在于其速度。 如果您需要优化产品以实现高效,低延迟的同步,则可能需要使用实时数据库而不是Cloud Firestore。 这并不是说Cloud Firestore无法完成这项工作。 它仍然可以超级快速地同步事物(以毫秒为单位)。 蒸气2.x 蒸气是市场上许多服务器端Swift库之一。 我觉得他们在使事情变得简单易懂并且使服务器端Swift开发的入门变得非常出色。 他们甚至最近推出了Vapor Cloud,这使将服务器部署到现实世界中非常容易。 小型项目甚至免费! 在此项目中,我使用了Vapor 2.x,因为当我开始时Vapor 3仍处于beta中。 我将使用这些技术来实现简单的概念验证,以便利用服务器端Swift来实现自定义后端逻辑,同时依靠Firebase实时更新客户端应用程序。 对于此演示,服务器将仅每60秒生成一个随机数,然后将该数字及其生成下一个随机数的日期发布到Cloud Firestore数据库。 当一切正常运行后,客户端应用程序将如下所示: […]