grpcweb 客户端请求grpc-java服务器

【Web逆向】Protobuf 逆向解析两种方法 严格说不算是加密,只能是叫序列化结构数据,让可读变为疑似的乱码。上面序列化的数据都可以复制保存为解析.bin文件,解析.bin文件显示原始数据有两种方法,都会出现还原失败的情况,这和复制下来的序列化数据有关。然后即可在cmd执行protoc --decode_raw < test.bin,其中test.bin是一个文件名称,即可看到原始数据。用 blackboxprotobuf 模块解析,即可看到原始数据,但是有可能是失败的结果。请求头里明显有提示,媒体类型是 proto,,下载对应版本并解压, 阅读详情

1. 定义grpc  proto文件:HelloWorld.proto

syntax = "proto3";

option java_package = "ex.grpc";
option objc_class_prefix = "HSW";

package helloworld;


service Greeter {
  rpc sayHello (HelloRequest) returns (HelloReply) {}

  rpc printAge (printAgeRequest) returns (printAgeReply) {}
}

message HelloRequest {
  string name = 1;
  string city = 2;
}

message HelloReply {
  string message = 1;
}

message printAgeRequest {
  string age = 1;
}

message printAgeReply {
  string text = 1;
}

2. java grpc服务

package com.storehelper.core.grpc;

import com.storehelper.grpc.common.RESPONSE_CODE;
import com.storehelper.grpc.passport.LoginRequest;
import com.storehelper.grpc.passport.LoginResponse;
import com.storehelper.grpc.passport.PassportServiceGrpc;
import com.storehelper.grpc.passport.TokenInfo;
import ex.grpc.GreeterGrpc;
import ex.grpc.HelloWorld;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;

import java.io.IOException;

public class CalculatorServer {

    public static void main(String[] args) throws IOException, InterruptedException {
        Server server = ServerBuilder.forPort(8082)
                //.addService(new PassportServiceImpl())
                .addService(new GreeterServiceImpl())
                .build();

        server.start();
        System.out.println("Server started at " + server.getPort());
        server.awaitTermination();
    }

    static class PassportServiceImpl extends PassportServiceGrpc.PassportServiceImplBase {
        @Override
        public void login(LoginRequest request, StreamObserver<LoginResponse> responseObserver) {
            LoginResponse response = null;
            response = LoginResponse.newBuilder()
                    .setCode(RESPONSE_CODE.SUCCESS)
                    .setMessage("登录成功")
                    .build();
            responseObserver.onNext(response);

            responseObserver.onCompleted();
        }
    }

    static class GreeterServiceImpl extends GreeterGrpc.GreeterImplBase{
        @Override
        public void sayHello(HelloWorld.HelloRequest request, StreamObserver<HelloWorld.HelloReply> responseObserver) {
            HelloWorld.HelloReply response = HelloWorld.HelloReply.newBuilder().setMessage("111").build();
            responseObserver.onNext(response);

            responseObserver.onCompleted();
        }

        @Override
        public void printAge(HelloWorld.printAgeRequest request, StreamObserver<HelloWorld.printAgeReply> responseObserver) {
            super.printAge(request, responseObserver);
        }
    }
}

3. grpc-web js生成

protoc   --js_out=import_style=commonjs:./src/protoc  --grpc-web_out=import_style=commonjs,mode=grpcweb:./src/protoc -I=src\protoc\     .\src\protoc\HelloWorld.proto

或者 ts生成

protoc   --js_out=import_style=commonjs:./src/protoc  --grpc-web_out=import_style=typescript,mode=grpcweb:./src/protoc -I=src\protoc\     .\src\protoc\HelloWorld.proto

4. grpc-web代码

<script>
import {
  GreeterClient
} from '@/protoc/HelloWorld_grpc_web_pb.js';
import { HelloRequest } from '@/protoc/HelloWorld_pb.js';



const client = new GreeterClient('http://localhost:8081/');

const helloRequest = new HelloRequest();
helloRequest.setCity('北京');
helloRequest.setName("11");
 
const metadata = {"Content-Type": "aplication/grpc"};//aplication/grpc

console.log(111111111111);
client.sayHello(helloRequest, metadata, (err, response) => {
  console.log(22222222);
  console.log(err, response);
  console.log(response.getMessage());
});
</script>

5.grpc-web代理:nginx

location / {
      
		
		  # 重点!!需要将Content-Type更改为 application/grpc
    # grpc-web过来的是application/grpc-web+proto || application/grpc-web+text (取决于生成js代码时grpc-web_out 的mode选项,本文用grpcweb 则为application/grpc-web+proto)
    grpc_set_header Content-Type application/grpc;
    grpc_pass localhost:8082;
    # 因浏览器有跨域限制,这里直接在nginx支持跨域
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Transfer-Encoding,Custom-Header-1,X-Accept-Content-Transfer-Encoding,X-Accept-Response-Streaming,X-User-Agent,X-Grpc-Web';
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain charset=UTF-8';
      add_header 'Content-Length' 0;
      return 204;
    }

    if ($request_method = 'POST') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Transfer-Encoding,Custom-Header-1,X-Accept-Content-Transfer-Encoding,X-Accept-Response-Streaming,X-User-Agent,X-Grpc-Web';
      add_header 'Access-Control-Expose-Headers' 'Content-Transfer-Encoding, grpc-message,grpc-status';
    }
  }

参考文档:

https://segmentfault.com/a/1190000022022271

Apache APISIX 新技能,代理 gRPC-Web 请求 Apache APISIX 已经支持了 gRPC 协议代理,以及通过 gRPC Transcode 插件支持了 HTTP(s) 到 gRPC Server 的代理。通过社区的积极讨论和贡献,Apache APISIX 又拓宽了 gRPC 生态的支持范围:支持 gRPC Web 协议请求代理。 阅读详情

相关推荐

某方数据平台的逆向分析-------学会逆向protobuf网站(上)

学会protobuf的web js逆向,学会基本上能解决目前遇到的protobuf网站

qq_56881388的博客 1673

【JS逆向系列】某方数据获取,proto入门

【JS逆向系列】某方数据获取,proto入门 样品网址:aHR0cHM6Ly93d3cud2FuZmFuZ2RhdGEuY29tLmNuL2luZGV4Lmh0bWw= 打开网站后,随便搜索一个关键词,这里以【百度】为例,本次需要分析的是【SearchService.SearchService/search】这个接口 这里可以看到,请求体不再是表单或者json,而是一堆类似乱码的东西,再看看响应体 也是一堆乱码,有的人可能就会想,会不会是有加密呢?当然不排除这个可能。接着再看看请求头,其中有一行是【co

zjq592767809的博客 3973

MLOps生产部署:分层治理与可观测性实战指南

机器学习模型上线不是训练完成的终点,而是工程化落地的起点。从Notebook到Production的核心挑战在于系统稳定性、服务可观测性与发布可控性。本文围绕MLOps生产部署中的计算隔离、gRPC服务治理、多维指标监控(含业务可用性、带标签的P99延迟、实时KS漂移检测)、灰度发布七步法及熔断自愈机制展开,融合Triton推理服务器、Envoy网关、Istio熔断与Prometheus可观测体系等关键技术实践。内容直击算法工程师转产线时最常遇到的OOM、503异常、灰度失效、告警失焦等真实问题,提供可复用

weixin_30294295的博客 350

gRPC-web:基础教程

echo.proto​创建gRPC服务的第一步是使用协议缓冲区定义服务方法及其请求和响应消息类型。在这个例子中,我们在一个名为echo.proto的文件中定义了EchoService。有关协议缓冲区和proto3语法的更多信息,请参阅protobuf文档。

aggs1990的专栏 1457

ESP32天线阵列实现Wi-Fi空间成像与无直视定位

Wi-Fi信道状态信息(CSI)是OFDM系统中表征多径传播特性的基础物理层参数,其复数值包含幅度与相位,可反映无线环境的空间特征。基于CSI的射频感知技术,通过提取子载波级信道响应,结合阵列信号处理,实现到达角(AoA)估计与深度映射,本质是将通信链路重构为空间域传感器。该技术无需专用雷达硬件,具备低成本、被动式、隐私友好等工程优势,在室内定位、行为识别、仓储导航等场景具有广泛落地价值。本文聚焦ESP32平台,详解多芯片相位同步、CSI零拷贝采集、嵌入式MUSIC算法及信道图谱轻量化部署等关键实现。

weixin_30632267的博客 236

如何使用ArcGIS自动矢量化建筑

在显示的重分类对话框内,输入栅格选择提取单波段后的栅格,重分类分为三个层级,旧值分别为100-249、250-251和252-255,对应新值为1、2和3,旧值的最小和最大值不用修改,保持和原有的一致。同样在ArcToolbox内点击Spatial Analyst工具点击“重分类\重分类”,在重分类对话框内输入栅格选择之前重分类过后的图片,将旧值3的新值设置为1,这样分类后就只有两类。在显示的新建Shapefile对话框内,名称命名为折线,要素类型选择折线,点击编辑,设置坐标系为WGS 1984。

2162

RPC之GRPC:什么是GRPC、GRPC的优缺点、GRPC使用场景

gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以高效地连接数据中心内和跨数据中心的服务,支持负载平衡、跟踪、运行状况检查和身份验证。它也适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。gRPC最初是由Google创建的,它使用了一个通用的RPC基础设施称为Stubby,用于连接大量微服务在其数据中心内部和之间运行了十多年。2015年3月, Google决定构建Stubby的下一个版本,并将其开源。

一码归一码@ 3388

手把手教你用C语言实现GNSS卫星方位角计算(附RTKLIB风格代码解析)

本文详细介绍了如何使用C语言实现GNSS卫星方位角计算,包括从地固坐标系到站心坐标系的转换链条。通过RTKLIB风格的代码解析,展示了XYZ到ENU坐标转换的核心原理和C语言实现框架,帮助开发者掌握卫星方位角和高度角的计算技巧,适用于GNSS观测数据质量分析和精密定位算法开发。

weixin_30699915的博客 364

gRPC-Web正式发布

前言: gRPC-Web是一个JavaScript客户端库,可以使Web应用程序直接与后端gRPC服务进行通信,而无需HTTP服务器充当中介。 这意味着可以通过使用.proto文件定义客户端和服务器端数据类型和服务接口,轻松构建真正的端到端gRPC应用程序体系结构。因此,gRPC-Web为Web开发的整个REST范例提供了一种引人注目的新替代方案。 基础: ...

weixin_30439131的博客 1088

飞书应用开发脚手架lark-harness:从零构建企业级机器人

在构建企业级应用时,开发脚手架是提升工程效率和规范性的关键工具。其核心原理在于通过预设的项目模板、最佳实践和通用模块封装,自动化处理项目初始化、配置管理和基础架构搭建。这种技术价值在于将开发者从重复性劳动中解放出来,确保团队技术栈统一,并降低维护成本。在Node.js生态中,脚手架常与Express或Koa等Web框架结合,用于快速构建Web服务、API接口和实时事件处理系统。具体到飞书开放平台开发场景,开发者需要处理OAuth 2.0授权、事件订阅验证、消息加解密等复杂且标准的流程。lark-harnes

weixin_30703911的博客 612

手把手教你在ARM64架构下编译和部署Milvus:从环境搭建到Docker镜像制作全攻略

本文详细介绍了如何在ARM64架构下编译和部署Milvus,包括环境搭建、源码下载与编译、Docker镜像制作等关键步骤。通过本文的方法,您可以快速构建适用于ARM64设备的Milvus编译环境,并解决常见的编译错误。同时,还提供了基于Docker Compose的测试方法,帮助用户高效地完成向量数据库的部署与应用。这是一次深入探索开源AI工具的实用指南,为开发者在多种硬件架构上的创新应用提供了强有力的支持。

小盒子的博客 1266

Blazor WebAssembly + Grpc Web=未来?

Blazor WebAssembly是什么首先来说说WebAssembly是什么,WebAssembly是一个可以使C#,Java,Golang等静态强类型编程语言,运行在浏览器中的标准,浏览器厂商基于此标准实现执行引擎。在实现了WebAssembly标准引擎之后,浏览器中可以执行由其他语言编译成的wasm模块。使用强类型编程语言的好处显而易见:可以选择更多的语言,编写前...

dotNET跨平台 597

本地搭建 GitLab 14.1.0版本CI/CD

GitLab 镜像版本 gitlab/gitlab-ce:14.1.0-ce.0 GitLab Runner 镜像版本 gitlab/gitlab-runner:v14.1.0 搭建此套环境是在一台32G的windows电脑上安装的。 使用dokcer安装。 此外还涉及的软件Docker Desktop,WSL 安装GitLab 首先启动 dockcer,打开WSL 打开后 首先定义GitLab的持久化目录 export GITLAB_HOME=/srv/gitlab 然后运行安装GitLab的命令

知无涯 4489

基于GRPC搭建高性能/跨平台微服务框架?

随着企业越来越多地转向微服务,对构建这些微服务的低延迟和可扩展框架的需求也在增加。为了满足这一需求,各种工具和框架提供商正加快满足微服务需求。同时从构建大型微服务应用程序的经验中学习,技术专业人士分享他们对可重用组件的知识,以便其他人可以构建具有相同规模和性能的架构。

stone1290的专栏 876

相机标定(六)—— 张正友标定法

相机标定一、相机标定的目的1. 相机的成像过程2. 相机标定的目的3. 畸变与畸变矫正二、张正友标定法简介三、标定相机内外参1. 求解内参和外参的积2. 求解内参矩阵3. 求解外参矩阵四、标定相机的畸变参数五、L-M算法参数优化六、相机标定的步骤七、源代码 一、相机标定的目的 1. 相机的成像过程 2. 相机标定的目的 3. 畸变与畸变矫正 二、张正友标定法简介 三、标定相机内外参 1. 求解内参和外参的积 2. 求解内参矩阵 3. 求解外参矩阵 四、标定相机的畸变参数 五、L-M算法参数优化 六、相机

weixin_41480034的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

搜索引擎利用(Google Hacking / Dorking)实战:基于 Learn-Web-Hacking 的 Web 信息收集指南

搜索引擎是 Web 渗透测试信息收集阶段最廉价而高效的信息源之一。恰当使用 Google / Bing / Yahoo / Baidu 等搜索引擎,可以获取目标站点的收录内容、敏感目录、后台入口、历史快照乃至源代码中的凭据。本篇指南以 Learn-Web-Hacking 仓库中 [搜索引擎利用](https://link.gitcode.com/i/b94bcf915a1aa4d345b8192a

gitblog_00630的博客 461

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Label Studio 完整实操入门:从一条命令启动到导出训练集

一套能直接喂给训练脚本的标注文件,是模型落地的前提。Label Studio 是一款开源的多类型数据标注与标注工具,让你用浏览器给文本、图像、音频、视频和时序数据打标签,并按 COCO、YOLO、CSV 等训练格式导出结果。它解决的是"标签没地方存、多人标起来乱、标完导不进训练管线"这三件麻烦事。本文按实际使用顺序走一遍:先把服务拉起来,再建项目、标第一批数据,然后接入模型、扩到团队,最后完成部署

gitblog_00391的博客 452

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Saber 免费手写笔记:高亮不压字、深色模式可反色,开源跨平台

期末前的一周,数学公式记了一半在平板、一段在手机、还有几页 PDF 标注躺在电脑里。Saber 就是这样一款开源的数字手写笔记应用:它专为手写设计,运行在手机、平板和电脑上,负责把这些分散的笔迹收拢到同一处。 它基于 Flutter 开发,按 GPLv3 开源,应用本身不收费。打开它,你首先看到的是"最近笔记"列表,而不是一堆功能菜单——这个取向贯穿整个应用。 ## 安装之前:先弄清三件事

gitblog_00039的博客 492

Gitpod IDE Metrics API 深度解析:基于 gRPC 的 IDE 指标采集与错误上报协议

Gitpod 的 IDE Metrics API 定义了 IDE 组件(VS Code、JetBrains 系插件、Supervisor 前端等)向中央服务上报性能指标与错误信息的标准化 gRPC 接口,是平台可观测性与稳定性体系的关键一环。本文以仓库中的 [ide-metrics-api 组件](https://link.gitcode.com/i/24d37d0c64fa972226fda7a

gitblog_00495的博客 434

gRPC-Web发布,REST又要被干掉了?

云原生计算基金会(CNCF)正式发布GA版本的gRPC-Web,这是一个JavaScript客户端库,使Web应用程序能够直接与后端gRPC服务通信,不需要HTTP服务器充当中介。这意味着你现在可以通过.proto文件来定义客户端和服务器端数据类型和服务接口,轻松构建真正的端到端gRPC应用程序架构。gRPC-Web为Web开发提供了REST之外的另一个选择。基础gRPC-Web让你能够使用.pr...

weixin_34236497的博客 521

3步搭好本地视频字幕提取工具:video-subtitle-extractor 把硬字幕转成 SRT

手动听写整理 1 小时视频的字幕大约需要 60 分钟,用 video-subtitle-extractor 完成同样内容大约只要 5-10 分钟。这是一款完全离线运行的本地 AI 字幕提取工具:不用申请任何第三方 API、视频不经过网络,它自动检测视频里的硬字幕区域,用 OCR 识别文字,最终生成可直接编辑的 SRT 字幕文件,覆盖中、英、日、韩、阿拉伯语等 87 种语言。 [![本地视频硬字幕

gitblog_00689的博客 969

三步给 skills4 技能目录加多语言支持:国际化完整指南

海外用户打开 skills4 里的技能,名称和描述全是英文,根本看不出它是干什么的。多语言支持(国际化,即把文案从文件里抽出来、按用户语言切换显示)就是为了解决这件事。skills4 是 Codex 智能体的技能目录,每个技能就是一个说明文档加资源的文件夹。下面三步带你把一个技能改造成多语言版本。 ## 项目速览 skills4 把技能做成一个个独立文件夹,装进 Codex 就能复用。和国际化

gitblog_00537的博客 309

JSON-RPC 快速开始

JSON是一种轻量级的数据交换格式,它可以表示数值、字符串、序列及名/值对集合。 JSON-RPC是一种无状态的,轻量级的远程程序调用协议。叫 JSON 的原因是因为返回值是 JSON。

西京刀客 2089

js 字符串读取成流数据_ProtoBuf序列化结构数据的抓取

网站在这里:首先还是抓包:比较有意思的是,post了一个不可见字符,这是之前解密js没有遇到的。在headers中看到这个:content-type: application/grpc-web+protoProtoBuf:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高...

weixin_39847732的博客 945
上一篇: 最近docker镜像地址
nddjava
博客等级 码龄16年 15粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值