Connect-Swift
Connect-Swift 是一个小型库 (<200KB!),它提供了支持使用生成的、类型安全的和惯用 Swift API 与您的应用服务器通信的功能,使用的是 Protocol Buffers (Protobuf)。它与 Connect、gRPC 和 gRPC-Web 协议一起工作。
设想一个不需要手动编写 Codable
模型用于 REST/JSON 端点,而可以直接通过调用生成的 API 方法来构建功能的世界,这些方法保证与服务器模型匹配。此外,设想永远不再需要担心序列化,并能够轻松使用生成的模拟进行测试,这些模拟符合相同的协议,与实际的实现相同。所有这些都可以通过 Connect-Swift 实现。
给定一个简单的 Protobuf 模式,Connect-Swift 会生成惯用的 Swift 协议接口和客户端实现
点击展开 eliza.connect.swift
public protocol Eliza_V1_ChatServiceClientInterface: Sendable {
func say(request: Eliza_V1_SayRequest, headers: Headers)
async -> ResponseMessage<Eliza_V1_SayResponse>
}
public final class Eliza_V1_ChatServiceClient: Eliza_V1_ChatServiceClientInterface, Sendable {
private let client: ProtocolClientInterface
public init(client: ProtocolClientInterface) {
self.client = client
}
public func say(request: Eliza_V1_SayRequest, headers: Headers = [:])
async -> ResponseMessage<Eliza_V1_SayResponse>
{
return await self.client.unary(path: "connectrpc.eliza.v1.ElizaService/Say", request: request, headers: headers)
}
}
然后这段代码可以通过几行代码进行集成
final class MessagingViewModel: ObservableObject {
private let elizaClient: Eliza_V1_ChatServiceClientInterface
init(elizaClient: Eliza_V1_ChatServiceClientInterface) {
self.elizaClient = elizaClient
}
@Published private(set) var messages: [Message] {...}
func send(_ userSentence: String) async {
let request = Eliza_V1_SayRequest.with { $0.sentence = userSentence }
let response = await self.elizaClient.say(request: request, headers: [:])
if let elizaSentence = response.message?.sentence {
self.messages.append(Message(sentence: userSentence, author: .user))
self.messages.append(Message(sentence: elizaSentence, author: .eliza))
}
}
}
这就完了!您不再需要手动定义 Swift 响应模型,添加 Codable
遵循,输入 URL(string: ...)
初始化器,甚至创建封装服务类的协议接口 - 所有这些 Connect-Swift 都会为您处理,底层的网络传输也是自动处理的。
使用与生产客户端相同的协议接口生成的模拟,测试也会变得非常简单
点击展开 eliza.mock.swift
open class Eliza_V1_ChatServiceClientMock: Eliza_V1_ChatServiceClientInterface, @unchecked Sendable {
public var mockAsyncSay = { (_: Eliza_V1_SayRequest) -> ResponseMessage<Eliza_V1_Response> in .init(message: .init()) }
open func say(request: Eliza_V1_SayRequest, headers: Headers = [:])
async -> ResponseMessage<Eliza_V1_SayResponse>
{
return self.mockAsyncSay(request)
}
}
func testMessagingViewModel() async {
let client = Eliza_V1_ChatServiceClientMock()
client.mockAsyncSay = { request in
XCTAssertEqual(request.sentence, "hello!")
return ResponseMessage(result: .success(.with { $0.sentence = "hi, i'm eliza!" }))
}
let viewModel = MessagingViewModel(elizaClient: client)
await viewModel.send("hello!")
XCTAssertEqual(viewModel.messages.count, 2)
XCTAssertEqual(viewModel.messages[0].message, "hello!")
XCTAssertEqual(viewModel.messages[0].author, .user)
XCTAssertEqual(viewModel.messages[1].message, "hi, i'm eliza!")
XCTAssertEqual(viewModel.messages[1].author, .eliza)
}
快速开始
访问我们的快速入门教程开始使用。只需约10分钟即可完成一个使用 Connect-Swift 的可工作的 SwiftUI 聊天应用!
文档
提供全面文档,包括拦截器、模拟/测试、流、以及错误处理,可在connectrpc.com网站上查阅。
示例应用
示例应用位于Examples
目录中,可以使用Xcode打开和构建。它们展示了
- 使用流API
- 与Swift包管理器集成
- 与CocoaPods集成
- 使用Connect 协议
- 使用gRPC 协议
- 使用gRPC-Web 协议
贡献
我们非常欢迎您的帮助来改进 Connect。
有关在本地构建库和生成器插件、运行测试以及贡献代码仓库的详细说明,请参阅我们CONTRIBUTING.md
指南。
生态系统
- connect-kotlin:针对 Kotlin 的惯用 gRPC 和 Connect RPC
- connect-go:服务器端 Go服务占位符
- connect-es:使用 Protobuf 和 TypeScript 的类型安全的 API
- Buf Studio:临时 RPC 的 Web UI
- conformance:Connect、gRPC 和 gRPC-Web 互操作性测试
状态
该项目处于测试阶段,随着我们从早期用户那里收集反馈,我们可能会做些调整。请在 Slack 上加入我们!
法律
在 Apache 2 许可证下提供。