正文
gRPC JSON转码
gRPC JSON 转码允许浏览器应用调用 gRPC 服务,就像它们是使用 JSON 的 RESTful API 一样。
- 浏览器应用不需要生成 gRPC 客户端或了解 gRPC 的任何信息。
- 通过使用 HTTP 元数据注释 .proto 文件,可从 gRPC 服务自动创建 RESTful API。
- 使应用可以同时支持 gRPC 和 JSON Web API,而无需重复为两者生成单独的服务。
- OpenAPI与gRPC Server
OpenAPI(以前称为 Swagger)是一个与语言无关的规范,用于描述 API。 gRPC JSON 转码支持从转码 REST ful的 API 生成 OpenAPI。
实现Server端
通过VS新增GRPC Server,新增nuget包
<ItemGroup> <PackageReference Include="Grpc.AspNetCore" Version="2.49.0" /> <PackageReference Include="Microsoft.AspNetCore.Grpc.JsonTranscoding" Version="7.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Grpc.Swagger" Version="0.3.0" /> </ItemGroup>
为api生成用于OpenAPI的注释XML文件,在Server.csproj文件中新增以下配置
<GenerateDocumentationFile>true</GenerateDocumentationFile>
Server的Program.cs中,开启JSON转码与Swagger
var builder = WebApplication.CreateBuilder(args); // 开启JSON转码 builder.Services.AddGrpc().AddJsonTranscoding(); // 配置Swagger builder.Services.AddGrpcSwagger(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "gRPC transcoding", Version = "v1" }); var filePath = Path.Combine(System.AppContext.BaseDirectory, "GrpcService4.xml"); c.IncludeXmlComments(filePath); c.IncludeGrpcXmlComments(filePath, includeControllerXmlComments: true); }); var app = builder.Build(); //开启Swagger app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); app.MapGrpcService<GreeterService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); app.Run();
下载GRPC JSON转码依赖的proto文件
https://github.com/dotnet/aspnetcore/blob/main/src/Grpc/JsonTranscoding/test/testassets/Sandbox/google/api/http.proto
https://github.com/dotnet/aspnetcore/blob/main/src/Grpc/JsonTranscoding/test/testassets/Sandbox/google/api/annotations.proto
并将文件放到项目的google/api/文件夹中。
修改greet.proto文件,通过option开启http选项,以一个get方法和一个post方法举例
syntax = "proto3"; import "google/api/annotations.proto"; option csharp_namespace = "GrpcService4"; package greet; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply){ option (google.api.http) = { get: "/v1/greeter/{name}" }; }; // Sends a greeting rpc SayHelloPost (HelloRequestPost) returns (HelloReply){ option (google.api.http) = { post: "/v1/greeter/post", body:"data" }; }; } // The request message containing the user's name. message HelloRequest { string name = 1; } // The request message containing the user's name. message HelloRequestPost { HelloRequestPostData data = 1; } message HelloRequestPostData{ string name = 1; string gender = 2; } // The response message containing the greetings. message HelloReply { string message = 1; }
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/293043.html