Golang中如何为Swagger API添加Co Client?

Golang中如何为Swagger API添加Co Client?

寻求帮助 - 如何为 Swagger API 添加 Go 客户端?

感谢您关注此问题。我正在使用 Swagger Editor 网站上提供的 Pet Store 示例,该示例展示了输入的 API 文件以及在 Swagger UI 中生成的 API:

https://editor.swagger.io/

我正尝试扩展此演示,以包含宠物图片(PNG 格式)、已输入文件的列表及其相关特征。

我能否为此 API 客户端使用另一种语言,例如 Go?

我确实尝试过从 Swagger 生成 Go 客户端,但未能找到添加上述功能的方法。

Go 官方网站提供的 REST API 教程并未讨论 Go 客户端。

我在网上(包括 YouTube 和其他论坛)查找了一些解释 API 客户端目的及其可用性的教程片段,但未找到任何提供合适解释的资料…

我尝试过其他论坛提供的一些 Go 脚本来读取图片(.png 格式)。在 Ubuntu 终端上,它打印出的是乱码文本而非图片。

是否有任何已发布的教程/指南可供遵循以实现上述目标?

感谢您的指导。


更多关于Golang中如何为Swagger API添加Co Client?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何为Swagger API添加Co Client?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中为Swagger API生成客户端并处理文件上传/下载,可以使用go-swagger工具。以下是具体步骤和示例代码:

1. 安装go-swagger工具

go install github.com/go-swagger/go-swagger/cmd/swagger@latest

2. 修改Swagger规范以支持文件上传

在您的Pet Store示例中添加文件上传端点:

paths:
  /pets/{id}/uploadImage:
    post:
      tags:
        - pet
      summary: Uploads an image
      operationId: uploadFile
      consumes:
        - multipart/form-data
      produces:
        - application/json
      parameters:
        - name: id
          in: path
          description: ID of pet to update
          required: true
          type: integer
          format: int64
        - name: file
          in: formData
          description: Image file to upload
          required: true
          type: file
      responses:
        '200':
          description: successful operation
          schema:
            $ref: '#/definitions/ApiResponse'

3. 生成Go客户端代码

swagger generate client -f swagger.yaml -A petstore

4. 使用生成的客户端上传文件

package main

import (
    "context"
    "fmt"
    "log"
    "os"
    
    "github.com/go-openapi/strfmt"
    "your-project/client"
    "your-project/client/pet"
)

func uploadPetImage() {
    // 初始化客户端
    cfg := client.DefaultTransportConfig().WithHost("localhost:8080")
    cli := client.NewHTTPClientWithConfig(strfmt.Default, cfg)
    
    // 打开图片文件
    file, err := os.Open("pet.png")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
    
    // 创建上传请求
    params := pet.NewUploadFileParams()
    params.ID = 1
    params.File = file
    
    // 执行上传
    resp, err := cli.Pet.UploadFile(context.Background(), params)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("Upload successful: %v\n", resp.Payload)
}

5. 处理文件下载的Swagger定义

paths:
  /pets/{id}/image:
    get:
      tags:
        - pet
      summary: Get pet image
      operationId: getPetImage
      produces:
        - image/png
      parameters:
        - name: id
          in: path
          description: ID of pet
          required: true
          type: integer
          format: int64
      responses:
        '200':
          description: successful operation
          schema:
            type: string
            format: binary

6. 下载文件的Go客户端代码

func downloadPetImage() {
    cfg := client.DefaultTransportConfig().WithHost("localhost:8080")
    cli := client.NewHTTPClientWithConfig(strfmt.Default, cfg)
    
    params := pet.NewGetPetImageParams()
    params.ID = 1
    
    resp, err := cli.Pet.GetPetImage(context.Background(), params)
    if err != nil {
        log.Fatal(err)
    }
    
    // 保存图片文件
    outFile, err := os.Create("downloaded_pet.png")
    if err != nil {
        log.Fatal(err)
    }
    defer outFile.Close()
    
    // 将响应体写入文件
    _, err = outFile.Write(resp.Payload)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Println("Image downloaded successfully")
}

7. 处理文件列表的示例

definitions:
  FileInfo:
    type: object
    properties:
      filename:
        type: string
      size:
        type: integer
      contentType:
        type: string
      characteristics:
        type: array
        items:
          type: string

paths:
  /files:
    get:
      tags:
        - files
      summary: Get list of uploaded files
      operationId: getFilesList
      produces:
        - application/json
      responses:
        '200':
          description: successful operation
          schema:
            type: array
            items:
              $ref: '#/definitions/FileInfo'

8. 完整的客户端初始化示例

package main

import (
    "context"
    "fmt"
    "log"
    
    httptransport "github.com/go-openapi/runtime/client"
    "github.com/go-openapi/strfmt"
    "your-project/client"
    "your-project/client/pet"
)

func main() {
    // 创建传输配置
    transport := httptransport.New("localhost:8080", "/v2", nil)
    
    // 创建客户端
    cli := client.New(transport, strfmt.Default)
    
    // 测试连接
    listParams := pet.NewFindPetsByStatusParams()
    listParams.Status = []string{"available"}
    
    pets, err := cli.Pet.FindPetsByStatus(context.Background(), listParams)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("Found %d pets\n", len(pets.Payload))
}

9. 处理二进制数据的自定义类型

如果需要处理图片显示,可以添加自定义类型处理:

// 自定义图片处理函数
func displayImageFromResponse(resp *pet.GetPetImageOK) {
    // 在终端显示图片(需要合适的终端支持)
    fmt.Printf("Image data received: %d bytes\n", len(resp.Payload))
    
    // 或者保存到文件
    err := os.WriteFile("display.png", resp.Payload, 0644)
    if err != nil {
        log.Fatal(err)
    }
    
    // 在Linux上可以使用外部命令显示
    // exec.Command("xdg-open", "display.png").Start()
}

这些代码示例展示了如何使用go-swagger为支持文件上传/下载的Swagger API生成和使用Go客户端。确保在生成代码前正确配置Swagger规范中的文件相关端点。

回到顶部