如何通过go micro api 实现文件下载呢

来源:6-12 购物车API层 添加熔断

慕的地4438983

2022-01-07

想通过 api 实现文件下载,但是发现response里没有地方可以直接写入最后生成的byte数组,哪位有思路可以指点一下。

写回答

1回答

只是为了好玩

2022-01-18

很好的问题!

你可以这样写:

文件位置:cartApi/proto/cartApi/cartApi.proto

syntax = "proto3";

package go.micro.api.cartApi;

service CartApi {
	rpc FindAll(Request) returns (Response) {}
	rpc Download(DownloadRequest) returns (stream DownloadResponse) {}
}

message Pair {
	string key = 1;
	repeated string values = 2;
}

message Request{
	string method =1;
	string path =2;
	map<string,Pair> header =3;
	map<string,Pair> get = 4;
	map<string,Pair> post =5;
	string body = 6;
	string url = 7;
}

message Response {
	int32 statusCode = 1;
	map<string,Pair> header = 2;
	string body = 3;
}

message DownloadRequest{
    string FilePath = 1;
    int32  MaxSize = 2; // 每一次下载的最大大小 单位MB
}

message DownloadResponse {
    string Name = 1;
    bytes  Buffer = 2;
    bool   IsDir = 3;
}

server.go

package main

import (
    pb "download/proto"
    "google.golang.org/grpc/codes"
    "google.golang.org/grpc/status"
)

var gDownloader = &Downloader{}

type DownloadServer struct {

}

func (d *DownloadServer) Download(in *pb.DownloadRequest, stream pb.DownloadService_DownloadServer) error {
    err := gDownloader.Download(in.FilePath, func (buffer []byte) error{
        return stream.Send(&pb.DownloadResponse{
            Buffer: buffer,
        })
    })

    if EndOfError == err {
        return status.Error(codes.Code(EOF), CodeToStr(EOF))
    }

    if NormallyCloseError == err {
        return status.Error(codes.Code(NORMALLY_EXIST), CodeToStr(NORMALLY_EXIST))
    }

    return err
}

重点关注接口是这样写的:

func (d *DownloadServer) Download(in *pb.DownloadRequest, stream pb.DownloadService_DownloadServer) error{}

以上完整代码参考网址:

https://www.codenong.com/cs106934388/

2
2
慕的地4438983
非常感谢!
2022-05-24
共2条回复

Go微服务入门到容器化实践,落地可观测微服务项目

这可能是你全面提升Go微服务能力的好机会

861 学习 · 322 问题

查看课程