Spécification HTTP RPC
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Correspondance Méthodes <-> Types
| HTTP Method | Mapping | Notes |
|---|---|---|
GET | .query() | Input JSON-stringified in query param. e.g. myQuery?input=${encodeURIComponent(JSON.stringify(input)) |
POST | .mutation() | Input as POST body. |
| n/a | .subscription() | Subscriptions are not supported in HTTP transport |
Traitement par lot (Batching)
Lors du traitement par lot, nous combinons tous les appels de procédure parallèles du même type dans une seule requête à l'aide d'un data loader.
-
Les noms des procédures appelées sont combinés par une virgule (
,) dans lepathname -
Les paramètres d'entrée sont envoyés via un paramètre de requête appelé
inputayant la formeRecord<number, unknown>. -
Nous devons également passer
batch=1comme paramètre de requête. -
Si la réponse présente des statuts différents, nous renvoyons
207 Multi-Status(par exemple, si un appel a échoué et un autre a réussi)
Exemple de requête groupée
Avec un routeur exposé à /api/trpc comme ceci :
server/router.tstsxexport const appRouter = trpc.router<Context>().query('postById', {input: String,async resolve({ input, ctx }) {const post = await ctx.post.findUnique({where: { id: input },});return post;},}).query('relatedPosts', {input: String,async resolve({ ctx, input }) {const posts = await ctx.findRelatedPostsById(input);return posts;},});
server/router.tstsxexport const appRouter = trpc.router<Context>().query('postById', {input: String,async resolve({ input, ctx }) {const post = await ctx.post.findUnique({where: { id: input },});return post;},}).query('relatedPosts', {input: String,async resolve({ ctx, input }) {const posts = await ctx.findRelatedPostsById(input);return posts;},});
.. Et deux requêtes définies ainsi dans un composant React :
MyComponent.tsxtsxexport function MyComponent() {const post1 = trpc.useQuery(['postById', '1']);const relatedPosts = trpc.useQuery(['relatedPosts', '1']);return (<pre>{JSON.stringify({post1: post1.data ?? null,relatedPosts: relatedPosts.data ?? null,},null,4,)}</pre>);}
MyComponent.tsxtsxexport function MyComponent() {const post1 = trpc.useQuery(['postById', '1']);const relatedPosts = trpc.useQuery(['relatedPosts', '1']);return (<pre>{JSON.stringify({post1: post1.data ?? null,relatedPosts: relatedPosts.data ?? null,},null,4,)}</pre>);}
Ceci générerait exactement 1 appel HTTP avec ces données :
| Location property | Value |
|---|---|
pathname | /api/trpc/postById,relatedPosts |
search | ?batch=1&input=%7B%220%22%3A%221%22%2C%221%22%3A%221%22%7D * |
*) input ci-dessus résulte de :
tsencodeURIComponent(JSON.stringify({0: '1', // <-- input for `postById`1: '1', // <-- input for `relatedPosts`}),);
tsencodeURIComponent(JSON.stringify({0: '1', // <-- input for `postById`1: '1', // <-- input for `relatedPosts`}),);
Exemple de réponse groupée
Example output from server
json[// result for `postById`{"id": null,"result": {"type": "data","data": {"id": "1","title": "Hello tRPC","body": "..."// ...}}},// result for `relatedPosts`{"id": null,"result": {"type": "data","data": [/* ... */]}}]
json[// result for `postById`{"id": null,"result": {"type": "data","data": {"id": "1","title": "Hello tRPC","body": "..."// ...}}},// result for `relatedPosts`{"id": null,"result": {"type": "data","data": [/* ... */]}}]
Spécification des réponses HTTP
Pour disposer d'une spécification indépendante de la couche de transport, nous nous efforçons de respecter JSON-RPC 2.0 lorsque possible.
Réponse de succès
Example JSON Response
json{"id": null,"result": {"type": "data","data": {"id": "1","title": "Hello tRPC","body": "..."}}}
json{"id": null,"result": {"type": "data","data": {"id": "1","title": "Hello tRPC","body": "..."}}}
ts{id: null;result: {type: 'data';data: TOutput; // output from procedure}}
ts{id: null;result: {type: 'data';data: TOutput; // output from procedure}}
Réponse d'erreur
Example JSON Response
json[{"id": null,"error": {"json": {"message": "Something went wrong","code": -32600, // JSON-RPC 2.0 code"data": {// Extra, customizable, meta data"code": "INTERNAL_SERVER_ERROR","httpStatus": 500,"stack": "...","path": "post.add"}}}}]
json[{"id": null,"error": {"json": {"message": "Something went wrong","code": -32600, // JSON-RPC 2.0 code"data": {// Extra, customizable, meta data"code": "INTERNAL_SERVER_ERROR","httpStatus": 500,"stack": "...","path": "post.add"}}}}]
-
Lorsque possible, nous propageons les codes de statut HTTP de l'erreur levée.
-
Si la réponse présente des statuts différents, nous renvoyons
207 Multi-Status(par exemple, si un appel a échoué et un autre a réussi) -
Pour approfondir les erreurs et leur personnalisation, consultez Formatage des erreurs.
Correspondance Codes d'erreur <-> Statuts HTTP
tsPARSE_ERROR: 400,BAD_REQUEST: 400,NOT_FOUND: 404,INTERNAL_SERVER_ERROR: 500,UNAUTHORIZED: 401,FORBIDDEN: 403,TIMEOUT: 408,CONFLICT: 409,CLIENT_CLOSED_REQUEST: 499,PRECONDITION_FAILED: 412,PAYLOAD_TOO_LARGE: 413,METHOD_NOT_SUPPORTED: 405,
tsPARSE_ERROR: 400,BAD_REQUEST: 400,NOT_FOUND: 404,INTERNAL_SERVER_ERROR: 500,UNAUTHORIZED: 401,FORBIDDEN: 403,TIMEOUT: 408,CONFLICT: 409,CLIENT_CLOSED_REQUEST: 499,PRECONDITION_FAILED: 412,PAYLOAD_TOO_LARGE: 413,METHOD_NOT_SUPPORTED: 405,
Correspondance Codes d'erreur <-> Codes d'erreur JSON-RPC 2.0
Available codes & JSON-RPC code
ts/*** JSON-RPC 2.0 Error codes** `-32000` to `-32099` are reserved for implementation-defined server-errors.* For tRPC we're copying the last digits of HTTP 4XX errors.*/export const TRPC_ERROR_CODES_BY_KEY = {/*** Invalid JSON was received by the server.* An error occurred on the server while parsing the JSON text.*/PARSE_ERROR: -32700,/*** The JSON sent is not a valid Request object.*/BAD_REQUEST: -32600, // 400/*** Internal JSON-RPC error.*/INTERNAL_SERVER_ERROR: -32603,// Implementation specific errorsUNAUTHORIZED: -32001, // 401FORBIDDEN: -32003, // 403NOT_FOUND: -32004, // 404METHOD_NOT_SUPPORTED: -32005, // 405TIMEOUT: -32008, // 408CONFLICT: -32009, // 409PRECONDITION_FAILED: -32012, // 412PAYLOAD_TOO_LARGE: -32013, // 413CLIENT_CLOSED_REQUEST: -32099, // 499} as const;
ts/*** JSON-RPC 2.0 Error codes** `-32000` to `-32099` are reserved for implementation-defined server-errors.* For tRPC we're copying the last digits of HTTP 4XX errors.*/export const TRPC_ERROR_CODES_BY_KEY = {/*** Invalid JSON was received by the server.* An error occurred on the server while parsing the JSON text.*/PARSE_ERROR: -32700,/*** The JSON sent is not a valid Request object.*/BAD_REQUEST: -32600, // 400/*** Internal JSON-RPC error.*/INTERNAL_SERVER_ERROR: -32603,// Implementation specific errorsUNAUTHORIZED: -32001, // 401FORBIDDEN: -32003, // 403NOT_FOUND: -32004, // 404METHOD_NOT_SUPPORTED: -32005, // 405TIMEOUT: -32008, // 408CONFLICT: -32009, // 409PRECONDITION_FAILED: -32012, // 412PAYLOAD_TOO_LARGE: -32013, // 413CLIENT_CLOSED_REQUEST: -32099, // 499} as const;
Approfondir
Vous trouverez plus de détails en explorant les définitions TypeScript dans :