在swiftui中使用Alamofire发送请求获取github仓库里的txt文件内容并解析
要在 SwiftUI 中使用 Alamofire 获取 GitHub 仓库中的文本文件内容(如 Base64 编码的文件),需要先发送请求获取文件元数据,然后解码文件内容。
以下是一个完整示例,展示如何从 https://api.github.com/repos/Sjj1024/Sjj1024/contents/docs/gitasync.txt
获取文件内容并解析为文本格式。
代码示例
import SwiftUI
import Alamofire
struct ContentView: View {
@State private var fileContent: String = "加载中..."
var body: some View {
VStack {
Text("GitHub 文件内容:")
.font(.headline)
.padding()
ScrollView {
Text(fileContent)
.padding()
}
Button("重新加载") {
fetchFileContent()
}
.padding()
}
.onAppear {
fetchFileContent()
}
}
// 发送请求获取文件内容
func fetchFileContent() {
let fileURL = "https://api.github.com/repos/Sjj1024/Sjj1024/contents/docs/gitasync.txt"
AF.request(fileURL).responseDecodable(of: GitHubFile.self) { response in
switch response.result {
case .success(let gitHubFile):
if let decodedContent = decodeBase64(gitHubFile.content) {
fileContent = decodedContent
} else {
fileContent = "解码失败"
}
case .failure(let error):
fileContent = "加载失败: \(error.localizedDescription)"
}
}
}
// Base64 解码
func decodeBase64(_ base64String: String) -> String? {
// 去除可能的换行符和空格
let cleanedBase64 = base64String.replacingOccurrences(of: "\n", with: "")
// 尝试解码
if let data = Data(base64Encoded: cleanedBase64) {
return String(data: data, encoding: .utf8)
}
return nil
}
}
// 定义 GitHub 文件数据结构
struct GitHubFile: Decodable {
let name: String
let path: String
let content: String
let encoding: String
}
代码说明
- GitHub API 地址:GitHub API 返回的文件内容通常是 Base64 编码的,因此需要解码。
- 数据模型:使用
GitHubFile
结构体解析 JSON 响应。 - 请求和解析:
- 使用
responseDecodable
自动解析 GitHub API 响应。 - 提取
content
字段并进行 Base64 解码。
- 使用
- Base64 解码:
- 删除响应内容中的换行符(GitHub API 返回的内容通常带有换行符)。
- 解码后转换为
String
并显示。
解析 GitHub API 响应示例
GitHub API 可能返回如下格式的 JSON 数据:
{
"name": "gitasync.txt",
"path": "docs/gitasync.txt",
"content": "U29tZSBzYW1wbGUgdGV4dA==\n",
"encoding": "base64"
}
content
是 Base64 编码的,需要解码为纯文本。
注意事项
- 网络权限:确保在
Info.plist
中添加以下内容,允许访问 GitHub API:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
- API 限流:GitHub API 有速率限制(通常未认证用户每小时最多 60 次请求)。如需更多请求,建议使用 GitHub 个人访问令牌。
- 错误处理:可以进一步扩展失败分支,处理各种响应状态码。
示例输出
GitHub 文件内容:
Some sample text