我制作了一个 swagger 2.0 规范端点来生成 CSV 格式的响应:
/query/csv:
post:
summary: Execute query and return response in CSV format
description: Executes query and returns response in CSV format
tags:
- Query
produces:
- "text/csv"
...
responses:
200:
description: "OK"
schema:
type: string
headers:
Content-Disposition:
type: string
description: A header specifying the file name
400:
description: "Bad request"
500:
description: "Internal error during request processing"
我在生成代码时使用 quay.io/goswagger/swagger:v0.25.0 图像:
docker run --rm -v $(PWD):/axxondatago -w /axxondatago -t $(SWAGGER_IMAGE) \
generate server \
--target=internal/app/query/rest \
--exclude-main \
-f api/openapi-spec/query.swagger.yml
在代码生成阶段之后,我获取查询响应的字符串有效负载类型:
...
return queryRest.NewExecuteQueryCSVOK().WithPayload(buffer) // var buffer string
但是 CSVProducer 期望类型转换的字节切片 https://github.com/go-openapi/runtime/blob/1ade6d4fa0ddfcfdcad57761eed3588b40cf41ae/csv.go#L58 并返回错误:
// CSVProducer creates a new CSV producer
func CSVProducer() Producer {
return ProducerFunc(func(writer io.Writer, data interface{}) error {
if writer == nil {
return errors.New("CSVProducer requires a writer")
}
dataBytes, ok := data.([]byte)
if !ok {
return errors.New("data type must be byte array")
}
我在端点的架构部分尝试了不同的字符串格式,例如“字节”、“二进制”和类型“文件”,但没有获得响应的字节切片。
我应该在架构中使用哪些类型和格式才能使 CSVProducer 正常工作?
像这样定义响应模式为我解决了这个问题
type: array
items:
type: number
format: uint8