我有以下“hello world”gRPC 服务在 c#、VS 2022 控制台客户端中工作,调用 http 和 https 端点;但在使用 Windows 版 Postman(版本 9.21.3)调用相同端点时出现错误。
原型:
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
发布http://localhost:5046/Greeter/SayHello
body > raw > {“名称”:“测试 grpc http”}
邮递员响应 ->“解析错误:服务器返回格式错误的响应”
postman 控制台 ->“错误:解析错误:预期 HTTP/”c# grpc 服务器控制台 -> 无
发布 https://localhost:7046/Greeter/SayHello
body > raw > {“Name”:“测试 grpc HTTPS”} 邮递员响应 - >“错误:套接字挂起”
c# grpc 服务器控制台 ->“未在仅 HTTP/2 端点上协商基于 TLS 的 HTTP/2。”
有人成功使用 c#/VS2022/Postman 堆栈吗?
更新
我现在正在通过@LaurentGabiot 在此处发布的链接创建我的请求: https://blog.postman.com/postman-now-supports-grpc/
现在我的两个 http/https 端点都遇到相同的错误:
“错误:协议无效:https”
在他们的示例中,他们的端点是:“grpcb.in:9000”,无论这意味着什么。不知道如何在 Vs2022/c# 中做到这一点。
注意:我将保留原来的错误(上面),以防其他人以与我相同的方式创建他们的请求。
只需输入不带方案的 URL 作为服务器 URL,即
localhost:5046
。
Postman 最近引入了对 gRPC 的支持。然而,gRPC 与基于 REST 或 HTTP 的服务有本质上的不同。 gRPC 使用 HTTP/2 协议和 protobuf 来处理消息,如果您习惯于传统的 HTTP 方法,设置可能会有点棘手。
确保您使用的是正确版本的 Postman:
为 gRPC 设置 Postman :
localhost
上的 5046
上运行,您将输入:localhost:5046
。导入.proto文件:
选择服务和方式:
Greeter
作为服务,选择 SayHello
作为方法。创建请求:
{
"name": "testing grpc http"
}
发送请求:
错误:解析错误:预期 HTTP/:
错误:协议无效:https:
未协商基于 TLS 的 HTTP/2 :
确保 C# 中的 gRPC 服务器配置为正确处理 HTTP/2 和基于 TLS 的 HTTP/2。这是一个基本示例:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>();
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("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");
});
});
}
}
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
grpcurl
或 gRPC 命令行客户端等工具可以帮助诊断独立于 Postman 的问题。遵循这些步骤应该可以帮助您使用 Postman 正确设置和测试 gRPC 服务。