Estoy tratando de llamar a un servicio gRPC desde la aplicación Angular.
Si alojo el servidor localmente y lo llamo desde la aplicación Anuglar, entonces funciona.
const client = new HelloWorldServiceClient("http://localhost:5001"); const request = new SayHelloMessage(); request.setName("User"); client.sayHelloWorld(request, (err: any, response: any) => { if (err) { console.log(err); this.response = err; return; } this.response = response.getMessage(); });Sin embargo, cuando intento llamar a un servicio gRPC alojado en un servidor remoto, arroja el error "Respuesta cerrada sin encabezados".
Código cambiado:
const client = new HelloWorldServiceClient("http://server_name:5001");Si trato de llamar al mismo servicio alojado en un servidor usando el cliente NodeJS, entonces también funciona.
Código NodeJS:
var url = "server_name_with_out_http:5001"; // eg server_name:5001 and not http://server_name:5001 const client = new HelloWorldServiceClient( url, grpc.credentials.createInsecure() ); var req = { name: "User" }; client.sayHelloWorld(req, (error, reply) => { if (!error) { console.log(reply.message); } else { console.log(error); } });¿Cuál podría ser la razón por la que la aplicación Angular no puede llamar al servicio gRPC alojado en el servidor?
Registros de la herramienta de desarrollo de Chrome:
Lo más probable es que esto se deba a las restricciones comunes del navegador CORS , y no exactamente a angular. Esta pregunta contiene una gran orientación sobre CORS.
Llamar a los servicios HTTP desde una aplicación de Node (o desde el cartero) no aplicará CORS, mientras que llamarlo desde un navegador estándar del mercado ciertamente lo haría.
Sé que hay mucho más que mis próximos comentarios simplificados, pero esto debería darle un punto de partida (una inmersión más profunda está en los enlaces que compartí anteriormente)
Para que los navegadores ejecuten XMLHttpRequest de un sitio web a otros dominios (u otros puertos del mismo dominio):
Access-Control-Allow-Origin , Access-Control-Request-* ...).==> Si el otro servidor no responde a las solicitudes de OPCIONES o no proporciona los encabezados apropiados en la respuesta de OPCIONES, puede obtener una variedad de errores diferentes, y "Respuesta cerrada sin encabezados" es uno de ellos.
Creo que su aplicación web gRPC no está configurada con el CORS adecuado para autorizar las comunicaciones desde el sitio web donde está alojando su aplicación angular (incluso si es localhost, aún tendría que configurarlo).
Este artículo tiene una guía práctica sobre cómo configurar CORS en aplicaciones .netcore
y finalmente, este problema/respuestas de github contiene más información sobre un error similar que algunas personas enfrentaron con gRPC, es posible que hayas entrado en el mismo. Si ya ha configurado sus reglas CORS.
Recomendaría no llamarlo directamente desde el cliente de su navegador (si eso no es lo que quiere, hágamelo saber) y use un proxy inverso en su lugar. Hay muchas herramientas para hacer eso:
De hecho, los ejemplos en el repositorio de Github de gRPC usan envoy ( marque aquí ) y uno de los correos en la lista de correo de grpc-io menciona que no se recomienda contactar directamente su backend con su interfaz web de gRPC.