简介
在没有服务器的情况下,可以利用github的仓库,作为数据存储,当然,在业务上不适合更新过快的数据场景。
代码
分为两步,一、提交数据,二、获取数据,先看第一步,提交数据
//
// CommitData.swift
// dataTogithub
//
// Created by lei silin on 2023/8/15.
//
import SwiftUI
struct CommitData: View {
@State private var commitMessage: String = ""
@State private var content: String = ""
var body: some View {
VStack {
TextField("Enter content", text: $content)
.padding()
TextField("Enter commit message", text: $commitMessage)
.padding()
Button("Submit to GitHub") {
submitToGitHub()
}
.padding()
}
.padding()
}
func submitToGitHub() {
let repository = "yourusername/yourrepository"
let accessToken = "your_personal_access_token"
let filePath = "path/to/your/file.txt" // Path to the file you want to fetch
// let content = "{\"result\":true,\"message\":\"请求成功\",\"data\":\"成功\",\"code\":0}"
guard let fileContent = content.data(using: .utf8) else {
print("Failed to encode file content")
return
}
let url = URL(string: "https://api.github.com/repos/\(repository)/contents/\(filePath)")!
var request = URLRequest(url: url)
request.httpMethod = "PUT"
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let base64FileContent = fileContent.base64EncodedString()
let requestBody: [String: Any] = [
"message": commitMessage,
"content": base64FileContent
]
do {
let jsonData = try JSONSerialization.data(withJSONObject: requestBody)
request.httpBody = jsonData
} catch {
print("Error encoding JSON")
return
}
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error: \(error.localizedDescription)")
return
}
if let httpResponse = response as? HTTPURLResponse {
if (200...299).contains(httpResponse.statusCode) {
print("Commit successful!")
} else {
print("Commit failed with status code: \(httpResponse.statusCode)")
}
}
}.resume()
}
}
struct CommitData_Previews: PreviewProvider {
static var previews: some View {
CommitData()
}
}
注意每次提交都需要重新命名,否则会显示422错误
第二步:获取数据
//
// PushData.swift
// dataTogithub
//
// Created by lei silin on 2023/8/15.
//
import SwiftUI
struct PushData: View {
@State private var fileContent: String = ""
var body: some View {
VStack {
Text(fileContent)
.padding()
Button("Fetch from GitHub") {
fetchFromGitHub()
}
.padding()
}
.padding()
}
func fetchFromGitHub() {
print("启动")
let repository = "yourusername/yourrepository"
let accessToken = "your_personal_access_token"
let filePath = "path/to/your/file.txt" // Path to the file you want to fetch
let url = URL(string: "https://api.github.com/repos/\(repository)/contents/\(filePath)")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error: \(error.localizedDescription)")
return
}
if let data = data {
do {
print("11")
let decodedData = try JSONDecoder().decode(GitHubContentResponse.self, from: data)
print(decodedData)
if let content = decodedData.content {
let cleanedContent = content.replacingOccurrences(of: "\n", with: "").replacingOccurrences(of: " ", with: "")
let trimmedContent = cleanedContent.trimmingCharacters(in: .whitespacesAndNewlines)
if let base64Data = Data(base64Encoded: trimmedContent),
let decodedContent = String(data: base64Data, encoding: .utf8) {
fileContent = decodedContent
print("打印出内容:", decodedContent)
} else {
print("Error decoding base64 content")
}
}
} catch {
print("Error decoding JSON: \(error)")
}
}
}.resume()
}
}
struct GitHubContentResponse: Codable {
let content: String?
// You might need to decode other fields from the API response as well
}
struct PushData_Previews: PreviewProvider {
static var previews: some View {
PushData()
}
}