You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在React中如何调用RPC?使用React Query调用是否存在差异?

RPC与REST、GraphQL的核心差异
  • 核心设计逻辑:RPC是面向方法的,调用远程服务的具体函数和调用本地方法逻辑一致,无需关心HTTP方法、资源定位规则,参数直接传递给目标方法即可;REST是面向资源的,依靠HTTP方法(GET/POST/PUT/DELETE)+ URL路径定义对资源的操作;GraphQL是面向查询的,客户端主动声明需要的字段结构,单次请求可聚合多个资源的数据。
  • 请求约束:RPC的请求格式、参数规则完全由服务端定义的方法约定,没有统一通用规范,不同RPC框架(gRPC、Thrift、JSON-RPC)的实现规则差异很大;REST要求严格遵循HTTP语义、资源定位规范;GraphQL有统一的查询语法规范,所有请求默认走同一个endpoint。
  • 适用场景:RPC适合内部服务通信、对性能延迟要求高的场景;REST适合对外公开的API、资源类操作场景;GraphQL适合前端需要灵活定制返回字段、多资源聚合的场景。
React 中发送RPC GET/POST请求的方法

前端场景最常用的是JSON-RPC协议,发送请求的逻辑和普通HTTP请求一致,只需要按照RPC协议规范构造参数即可:

POST方式(最常用)

// 调用RPC的getUserInfo方法,传参userId=123
fetch('https://your-rpc-server-endpoint', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    jsonrpc: '2.0', // JSON-RPC协议固定版本字段
    method: 'getUserInfo', // 要调用的RPC方法名,必填
    params: { userId: 123 }, // 方法对应入参
    id: 1, // 请求唯一标识,用于匹配对应响应
  })
})
.then(res => res.json())
.then(data => console.log(data.result))

GET方式

GET请求只需把所有RPC参数作为查询参数拼接在URL后即可:

const rpcParams = new URLSearchParams({
  jsonrpc: '2.0',
  method: 'getUserInfo',
  params: JSON.stringify({ userId: 123 }),
  id: 1
})
fetch(`https://your-rpc-server-endpoint?${rpcParams.toString()}`)
.then(res => res.json())
.then(data => console.log(data.result))
React Query 调用RPC的差异

React Query本身只负责请求状态管理、缓存、重试等通用逻辑,和底层使用的请求协议无关,调用RPC和调用REST、GraphQL的逻辑基本没有差异,唯一的区别是需要在queryFn/mutationFn里按照RPC规范构造请求参数即可,示例如下:

import { useQuery } from '@tanstack/react-query'

// 封装RPC getUserInfo的请求逻辑
const fetchUserInfo = async (userId) => {
  const res = await fetch('https://your-rpc-server-endpoint', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      method: 'getUserInfo',
      params: { userId },
      id: 1
    })
  })
  const data = await res.json()
  if (data.error) throw new Error(data.error.message)
  return data.result
}

// 组件内调用和REST/GraphQL场景完全一致
function UserProfile({ userId }) {
  const { data, isLoading, error } = useQuery({
    queryKey: ['userInfo', userId],
    queryFn: () => fetchUserInfo(userId)
  })

  if (isLoading) return <div>加载中</div>
  if (error) return <div>请求失败:{error.message}</div>
  return <div>用户名:{data.userName}</div>
}

内容的提问来源于stack exchange,提问作者Mohammad Vahedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:39:01