diff --git a/README.md b/README.md index d064f5f..6876634 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ git config --global url."ssh://gitea@gitea.drugeyes.vip".insteadOf "https://gite 3. 拉取对应版本 ```shell -go get gitea.drugeyes.vip/pharnexbase/tools@v1.0.0 +go get gitea.drugeyes.vip/pharnexbase/utils@v1.0.0 ``` ## 通用包 @@ -38,11 +38,12 @@ go get gitea.drugeyes.vip/pharnexbase/tools@v1.0.0 > 说明 -### transport:通用http ResponseEncoder +### transport:通用http Encoder * v1 - > 通用http ResponseEncoder + > 请求和响应封装 + > - ResponseEncoder ### meta:跨服务meta信息设置和获取 diff --git a/transport/v1/http/codec.go b/transport/v1/http/response.go similarity index 66% rename from transport/v1/http/codec.go rename to transport/v1/http/response.go index b0140ec..28b8dfb 100644 --- a/transport/v1/http/codec.go +++ b/transport/v1/http/response.go @@ -2,6 +2,7 @@ package http import ( "fmt" + transPbV1 "gitea.drugeyes.vip/pharnexbase/utils/transport/v1" "github.com/go-kratos/kratos/v2/errors" "github.com/go-kratos/kratos/v2/transport/http" stdhttp "net/http" @@ -24,16 +25,35 @@ func ResponseEncoder(w stdhttp.ResponseWriter, r *stdhttp.Request, v interface{} return nil } + // 重定向 + if rd, ok := v.(http.Redirector); ok { + url, code := rd.Redirect() + stdhttp.Redirect(w, r, url, code) + return nil + } + + // 文件下载 + if data, ok := v.(*transPbV1.FileResponse); ok { + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", data.Filename)) + if data.Filetype != "" { + w.Header().Set("Content-Type", data.Filetype) + } + w.Header().Set("Access-Control-Expose-Headers", "*") + w.WriteHeader(stdhttp.StatusOK) + w.Write(data.Data) + + return nil + } + codec, _ := http.CodecForRequest(r, "Accept") data, err := codec.Marshal(v) if err != nil { return err } - application := strings.Join([]string{baseContentType, codec.Name()}, "/") - w.Header().Set("Content-Type", application) + w.Header().Set("Content-Type", ContentType(codec.Name())) - d := fmt.Sprintf(`{"code": 0,"data": %s,"reason": "","message": ""}`, string(data)) + d := fmt.Sprintf(`{"code": 200,"data": %s,"reason": "","message": ""}`, string(data)) _, err = w.Write([]byte(d)) if err != nil { diff --git a/transport/v1/transport.pb.go b/transport/v1/transport.pb.go new file mode 100644 index 0000000..cdf464c --- /dev/null +++ b/transport/v1/transport.pb.go @@ -0,0 +1,167 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.0--rc1 +// source: pharnexbase/transport/v1/transport.proto + +package v1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// 文件下载返回响应参数 +type FileResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + Filename string `protobuf:"bytes,2,opt,name=filename,proto3" json:"filename,omitempty"` + Filetype string `protobuf:"bytes,3,opt,name=filetype,proto3" json:"filetype,omitempty"` +} + +func (x *FileResponse) Reset() { + *x = FileResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_pharnexbase_transport_v1_transport_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileResponse) ProtoMessage() {} + +func (x *FileResponse) ProtoReflect() protoreflect.Message { + mi := &file_pharnexbase_transport_v1_transport_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileResponse.ProtoReflect.Descriptor instead. +func (*FileResponse) Descriptor() ([]byte, []int) { + return file_pharnexbase_transport_v1_transport_proto_rawDescGZIP(), []int{0} +} + +func (x *FileResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *FileResponse) GetFilename() string { + if x != nil { + return x.Filename + } + return "" +} + +func (x *FileResponse) GetFiletype() string { + if x != nil { + return x.Filetype + } + return "" +} + +var File_pharnexbase_transport_v1_transport_proto protoreflect.FileDescriptor + +var file_pharnexbase_transport_v1_transport_proto_rawDesc = []byte{ + 0x0a, 0x28, 0x70, 0x68, 0x61, 0x72, 0x6e, 0x65, 0x78, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x70, 0x68, 0x61, 0x72, + 0x6e, 0x65, 0x78, 0x62, 0x61, 0x73, 0x65, 0x22, 0x5a, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x74, + 0x79, 0x70, 0x65, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x65, 0x61, 0x2e, 0x64, 0x72, 0x75, + 0x67, 0x65, 0x79, 0x65, 0x73, 0x2e, 0x76, 0x69, 0x70, 0x2f, 0x70, 0x68, 0x61, 0x72, 0x6e, 0x65, + 0x78, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_pharnexbase_transport_v1_transport_proto_rawDescOnce sync.Once + file_pharnexbase_transport_v1_transport_proto_rawDescData = file_pharnexbase_transport_v1_transport_proto_rawDesc +) + +func file_pharnexbase_transport_v1_transport_proto_rawDescGZIP() []byte { + file_pharnexbase_transport_v1_transport_proto_rawDescOnce.Do(func() { + file_pharnexbase_transport_v1_transport_proto_rawDescData = protoimpl.X.CompressGZIP(file_pharnexbase_transport_v1_transport_proto_rawDescData) + }) + return file_pharnexbase_transport_v1_transport_proto_rawDescData +} + +var file_pharnexbase_transport_v1_transport_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_pharnexbase_transport_v1_transport_proto_goTypes = []interface{}{ + (*FileResponse)(nil), // 0: pharnexbase.FileResponse +} +var file_pharnexbase_transport_v1_transport_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_pharnexbase_transport_v1_transport_proto_init() } +func file_pharnexbase_transport_v1_transport_proto_init() { + if File_pharnexbase_transport_v1_transport_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_pharnexbase_transport_v1_transport_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_pharnexbase_transport_v1_transport_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_pharnexbase_transport_v1_transport_proto_goTypes, + DependencyIndexes: file_pharnexbase_transport_v1_transport_proto_depIdxs, + MessageInfos: file_pharnexbase_transport_v1_transport_proto_msgTypes, + }.Build() + File_pharnexbase_transport_v1_transport_proto = out.File + file_pharnexbase_transport_v1_transport_proto_rawDesc = nil + file_pharnexbase_transport_v1_transport_proto_goTypes = nil + file_pharnexbase_transport_v1_transport_proto_depIdxs = nil +}