Connect-Swift 是一个小型库(<200KB!),它支持使用生成的、类型安全且符合 Swift 语言习惯的 API,通过 Protocol Buffers (Protobuf) 与您的应用服务器进行通信。它适用于 Connect、gRPC 和 gRPC-Web 协议。
想象一下,您无需为 REST/JSON 端点手动编写 Codable
模型,而是可以直接通过调用一个保证与服务器建模相匹配的生成的 API 方法来构建功能。 此外,想象一下再也不用担心序列化问题,并且能够轻松地使用符合真实实现相同协议的生成模拟来编写测试。Connect-Swift 可以实现所有这些。
给定一个简单的 Protobuf schema,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 打开和构建。 它们演示了
我们非常希望您能帮助我们改进 Connect!
我们的 CONTRIBUTING.md
指南中提供了在本地构建库和生成器插件、运行测试以及为存储库做出贡献的详细说明。 请查看了解详细信息。
该项目稳定并遵循语义版本控制,这意味着任何重大更改都会导致主版本号增加。 我们的目标是不进行重大更改,除非绝对必要。
根据 Apache 2 许可证 提供。