golang与OpenProject API交互的客户端插件库go-openproject的使用
Golang与OpenProject API交互的客户端插件库go-openproject的使用
OpenProject Go客户端库
这是一个用于与OpenProject API交互的Golang客户端库。
API文档
OpenProject官方API文档
使用示例
获取单个工作包
基本的工作包检索示例(从community.openproject.org获取ID为36353的工作包)
import (
"fmt"
openproj "github.com/manuelbcd/go-openproject"
)
func main() {
client, _ := openproj.NewClient(nil, "https://community.openproject.org/")
wpResponse, _, err := client.WorkPackage.Get("36353", nil)
if err != nil {
panic(err)
}
// 输出响应中的特定字段
fmt.Printf("\n\nSubject: %s \nDescription: %s\n\n", wpResponse.Subject, wpResponse.Description.Raw)
}
创建工作包
创建一个工作包的示例
package main
import (
"fmt"
"strings"
openproj "github.com/manuelbcd/go-openproject"
)
func main() {
client, err := openproj.NewClient(nil, "https://youropenproject.url")
if err != nil {
fmt.Printf("\nerror: %v\n", err)
return
}
i := openproj.WorkPackage{
Subject: "This is my test work package",
Description: &openproj.WPDescription{
Format: "textile",
Raw: "This is just a demo workpackage description",
},
}
wpResponse, _, err := client.WorkPackage.Create(&i, "demo-project")
if err != nil {
panic(err)
}
// 输出响应中的特定字段
fmt.Printf("\n\nSubject: %s \nDescription: %s\n\n", wpResponse.Subject, wpResponse.Description.Raw)
}
支持的对象
端点 | 获取单个 | 获取多个 | 创建 | 更新 | 删除 |
---|---|---|---|---|---|
附件(信息) | ✔️ | ✔️ | 实现中 | - | 待实现 |
附件(下载) | ✔️ | - | - | - | - |
分类 | ✔️ | ✔️ | - | - | - |
文档 | 实现中 | - | - | - | - |
项目 | ✔️ | ✔️ | ✔️ | 待实现 | 待实现 |
查询 | ✔️ | ✔️ | ✔️ | - | ✔️ |
模式 | 待实现 | ||||
状态 | ✔️ | ✔️ | 待实现 | 待实现 | 待实现 |
用户 | ✔️ | ✔️ | ✔️ | ✔️ | |
Wiki页面 | ✔️ | 待实现 | 待实现 | 待实现 | 待实现 |
工作包 | ✔️ | ✔️ | ✔️ | ✔️ | |
活动 | ✔️ | ✔️ |
致谢
感谢Wieland、Oliver和OpenProject团队的支持。
非常感谢Andy Grunwald的想法和基础代码。
灵感来源于Go Jira库
更多关于golang与OpenProject API交互的客户端插件库go-openproject的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang与OpenProject API交互的客户端插件库go-openproject的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-openproject: 与OpenProject API交互的Golang客户端库
go-openproject是一个用于与OpenProject项目管理软件API交互的Golang客户端库。下面我将介绍如何使用这个库进行基本的OpenProject API操作。
安装
首先安装go-openproject库:
go get github.com/opf/go-openproject
基本使用
1. 初始化客户端
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/opf/go-openproject"
)
func main() {
// 从环境变量获取API密钥
apiKey := os.Getenv("OPENPROJECT_API_KEY")
if apiKey == "" {
log.Fatal("OPENPROJECT_API_KEY环境变量未设置")
}
// 初始化客户端
client, err := openproject.NewClient(nil, "https://your-openproject-instance.com", apiKey)
if err != nil {
log.Fatalf("创建客户端失败: %v", err)
}
// 测试连接
testConnection(client)
}
func testConnection(client *openproject.Client) {
ctx := context.Background()
// 获取当前用户信息
user, _, err := client.Me.Get(ctx)
if err != nil {
log.Fatalf("获取用户信息失败: %v", err)
}
fmt.Printf("成功连接OpenProject! 当前用户: %s (%s)\n", user.Name, user.Email)
}
2. 项目管理
// 获取所有项目
func listProjects(client *openproject.Client) {
ctx := context.Background()
projects, _, err := client.Project.List(ctx, nil)
if err != nil {
log.Fatalf("获取项目列表失败: %v", err)
}
fmt.Println("项目列表:")
for _, p := range projects.Embedded.Elements {
fmt.Printf("- %s (ID: %d)\n", p.Name, p.Id)
}
}
// 创建新项目
func createProject(client *openproject.Client) {
ctx := context.Background()
newProject := &openproject.ProjectPayload{
Name: "新项目示例",
Description: "这是一个通过API创建的项目",
Status: "on track",
Public: false,
}
project, _, err := client.Project.Create(ctx, newProject)
if err != nil {
log.Fatalf("创建项目失败: %v", err)
}
fmt.Printf("成功创建项目: %s (ID: %d)\n", project.Name, project.Id)
}
3. 工单管理
// 获取项目工单
func listWorkPackages(client *openproject.Client, projectID int) {
ctx := context.Background()
filters := []*openproject.Filter{
{
Project: &openproject.ProjectFilter{
Operator: "=",
Values: []string{fmt.Sprintf("%d", projectID)},
},
},
}
wps, _, err := client.WorkPackage.List(ctx, filters, nil, nil, nil)
if err != nil {
log.Fatalf("获取工单列表失败: %v", err)
}
fmt.Println("工单列表:")
for _, wp := range wps.Embedded.Elements {
fmt.Printf("- %s (ID: %d, 状态: %s)\n", wp.Subject, wp.Id, wp.Embedded.Status.Name)
}
}
// 创建新工单
func createWorkPackage(client *openproject.Client, projectID int) {
ctx := context.Background()
newWP := &openproject.WorkPackagePayload{
Subject: "API创建的工单示例",
Description: "这是通过API创建的工单描述",
Type: "Task",
Project: &openproject.Project{Id: projectID},
}
wp, _, err := client.WorkPackage.Create(ctx, newWP)
if err != nil {
log.Fatalf("创建工单失败: %v", err)
}
fmt.Printf("成功创建工单: %s (ID: %d)\n", wp.Subject, wp.Id)
}
4. 自定义字段和更新操作
// 更新工单
func updateWorkPackage(client *openproject.Client, wpID int) {
ctx := context.Background()
update := &openproject.WorkPackagePayload{
Description: "更新后的描述内容",
Status: &openproject.Status{Id: 2}, // 假设2是"进行中"状态的ID
CustomFields: []*openproject.CustomField{
{
Id: 1, // 自定义字段ID
Value: "高优先级",
},
},
}
wp, _, err := client.WorkPackage.Update(ctx, wpID, update)
if err != nil {
log.Fatalf("更新工单失败: %v", err)
}
fmt.Printf("成功更新工单ID %d: %s\n", wp.Id, wp.Subject)
}
高级用法
分页和过滤
func listWorkPackagesWithPaging(client *openproject.Client) {
ctx := context.Background()
// 设置分页参数
page := 1
pageSize := 10
// 设置过滤器 - 只获取特定状态的工单
filters := []*openproject.Filter{
{
Status: &openproject.StatusFilter{
Operator: "=",
Values: []string{"3"}, // 假设3是"已完成"状态的ID
},
},
}
// 设置排序 - 按创建日期降序
sortBy := []*openproject.SortParam{
{
Field: "createdAt",
Direction: "desc",
},
}
wps, resp, err := client.WorkPackage.List(ctx, filters, sortBy, &page, &pageSize)
if err != nil {
log.Fatalf("获取工单列表失败: %v", err)
}
fmt.Printf("第%d页,共%d页\n", page, resp.TotalPages)
fmt.Println("已完成工单:")
for _, wp := range wps.Embedded.Elements {
fmt.Printf("- %s (创建于: %s)\n", wp.Subject, wp.CreatedAt.Format("2006-01-02"))
}
}
错误处理
func handleErrors(client *openproject.Client) {
ctx := context.Background()
// 尝试获取不存在的工单
_, resp, err := client.WorkPackage.Get(ctx, 999999)
if err != nil {
if resp != nil && resp.StatusCode == 404 {
fmt.Println("工单不存在")
} else {
log.Fatalf("获取工单失败: %v", err)
}
}
}
总结
go-openproject库提供了与OpenProject API交互的便捷方式。通过这个库,你可以:
- 管理项目和工单
- 处理自定义字段
- 实现复杂的分页和过滤查询
- 执行创建、读取、更新和删除操作
在实际使用时,建议:
- 将API密钥存储在环境变量中
- 添加适当的错误处理和日志记录
- 对于批量操作,考虑添加适当的延迟以避免API速率限制
- 定期检查库更新以获取新功能和修复
希望这个指南能帮助你开始使用go-openproject库与OpenProject API进行交互!