рдирдорд╕реНрддреЗ,
рдореИрдВ рдмрд╛рдХреА рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдкреНрд░рддрд┐ useQuery() response.headers
рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рдХреА рдПрдкреАрдЖрдИ, рдЬреЛ рд╣реЗрдбрд░ рдореЗрдВ first, prev, next, last
рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рд▓рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рд╣реИ: https://codesandbox.io/embed/how-to-access-response-0mqx7?file=/src/Client.ts
рдЖрдк рдбреЗрд╡рд▓рдк рдЯреВрд▓ Network
рдЯреИрдм рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЦреЗрдВ, рд▓рд┐рдВрдХ рдореЗрдВ , рдкреЗрдЬрд┐рдиреЗрд╢рди рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ Headers
рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪреЗрдВ ....
рд╣рд╛рдпрд░ рдореЗрд░рд╛ рдореБрдЦреНрдп рдХреЛрдб рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, response.headers.link
рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ...
const queryTodos = gql`
query Todos($page: number, $limit: number) {
todos(_page: $page, _limit: $limit)
@rest(type: "[Todo]", path: "/todos/?{args}") {
userId
id
title
completed
}
}
`;
export const Todos = () => {
const { data, loading, error } = useQuery(queryTodos, {
variables: { page: 1, limit: 3 },
fetchPolicy: "no-cache"
});
...
return (<div>...</div>)
рдореИрдВрдиреЗ рдпрд╣ рдкреНрд░рд╢реНрди рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдореЗрдВ рднреА рдкреВрдЫрд╛: https://stackoverflow.com/q/64791676/32799996 , рдпрджрд┐ рдЖрдк рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВред :рдбреА
@blatoo - рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рдореВрд▓ рд░реВрдк рд╕реЗ, рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╣реЗрдбрд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд╛рдл рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ "рдмреЙрдбреА" рдореЗрдВ рдПрдХ рдЧреБрдкреНрдд/рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ __headers
рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреАрдЪрд░-рдлреНрд▓реИрдЧ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рд╕рдВрдЧрдд рд╣реЛрдВред
const queryTodos = gql`
query Todos($page: number, $limit: number) {
todos(_page: $page, _limit: $limit)
@rest(type: "[Todo]", path: "/todos/?{args}") {
+ __headers {
+ XMyHeader
+ }
userId
id
title
completed
}
}
`;
@fbartho рдЗрд╕ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЕрдЧрд░ рд╣рдо рд╣реЗрдбрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред рдореИрдВ рдЬреЗрд╕рди-рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд╡реЗ Headers
рдореЗрдВ рдкреЗрдЬрд┐рдиреЗрд╢рди рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдХрд░реНрд╕рд░ рдЖрдзрд╛рд░рд┐рдд рдкреЗрдЬрд┐рдиреЗрд╢рди рдЗрдиреНрдлреЛрд╕ рдХреЗ рд▓рд┐рдП рднреА рдбрд╛рд▓рддреЗ рд╣реИрдВред
рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ: responseTansformer
рдФрд░ customFetch
рд╡рд┐рдХрд▓реНрдкред рдХреНрдпрд╛ рдореИрдВ рдкреЗрдЬрд┐рдиреЗрд╢рди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ ??? рдЕрд╕рд▓ рдореЗрдВ рдореИрдВрдиреЗ рдмрд╣реБрдд рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдорд┐рд▓реА...:
https://www.apollographql.com/docs/link/links/rest/#response -transforming
https://www.apollographql.com/docs/link/links/rest/#custom -fetch
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, apollo-link-rest
рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдореЗрдВ рдкреНрд▓рдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП apollo-link
рдХреЗ рдПрдкреАрдЖрдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЬреЗрдПрд╕ Headers
рдПрдкреАрдЖрдИ рдХреЛ рд╕реАрдзреЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, responseTransformer
рдпрд╛ customFetch
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЛ рдЬреЛ рдЪрд╛рд╣рд┐рдП рдЙрд╕реЗ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
responseTransformer
рдХреЛ JS Response
рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ response.headers
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИред
рддреЛ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
responseTransformer: async (resp: Response) => {
const body = await resp.json();
const interestingHeaders = {};
interestingHeaders.headerOne = resp.headers.get("headerOne"); // Pluck out the headers you want
body.__headers = interestingHeaders
return body;
}
рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ headers.entries()
рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЗрдбрд░ рдХреЗ рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП headers.get()
- рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдХрд┐ рд╕рдлрд╛рд░реА-рдЖрдИрдУрдПрд╕ рдореЗрдВ рдЕрднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд░рд▓реАрдХреГрдд рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЖрдк рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛!
customFetch
рднреА рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ responseTransformer
рдЖрд╕рд╛рди рд╣реИред
@fbartho рд╡рд╛рд╣, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ! рдореИрдВрдиреЗ рдЕрднреА рдЖрдкрдХреЗ рдХреЛрдб рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рд┐рдВрдХ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред
рдЕрдм рдпрд╣ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЖрддреА рд╣реИ, рдореИрдВ рдХреНрд╡реЗрд░реА рдореЗрдВ body.__headers.link
рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдореЗрд░рд╛ рдХреНрд╡реЗрд░реА рдХреЛрдб рд╣реИ:
const queryTodos = gql`
query Todos($page: number, $limit: number) {
todos(_page: $page, _limit: $limit)
@rest(type: "TodoPagination", path: "/todos/?{args}") {
__headers {
link
}
userId
id
title
completed
}
}
`;
рд▓реЗрдХрд┐рди __headers
рдХрд╛ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╢реВрдиреНрдп рд╣реИ ...
рдХреЛрдб рдпрд╣рд╛рдВ рд╣реИ: рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рдХреЛрдб Client.ts
рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ рдФрд░ рдХреНрд╡реЗрд░реА рдХреЛрдб Todo.tsx
:
https://codesandbox.io/s/how-to-access-response-0mqx7?file=/src/Todos.tsx
@fbartho рд╣рд╛рдп, рдореИрдВрдиреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЖрдЦрд┐рд░ рдореЗрдВ, рдореИрдВрдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЕрдкрдиреА рд░рд╛рдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?
рд╡рд┐рдзрд┐ 1: рд╡рд┐рдлрд▓ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ __headers
рдореЗрдВ useQuery()
рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдХрдИ рдмрд╛рд░ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЕрд╕рдлрд▓ рд░рд╣рд╛ред
рд╡рд┐рдзрд┐ 2: рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИ
responseTransformer
рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрджрд▓реЗрдВ, __headers
рдХреЛ __headers
рдХреБрдВрдЬреА рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдЯреВрдбреВ рд╕реВрдЪреА рдХреЛ todo
рдХреБрдВрдЬреА рдореЗрдВ рднреА рд░рдЦреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рднреА рд╕рдВрд░рдЪрдирд╛ рдмрджрд▓ рджреА рдЬрд╛рдПрдЧреАред рддреЛ рдореБрдЭреЗ useQuery()
рдореЗрдВ рд╕рднреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рд╡рд┐рдзрд┐ 3: рд╕рдлрд▓рддрд╛ рдФрд░ рдореГрдд рд╕рд░рд▓
рдореИрдВрдиреЗ __headers
рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЪрд░ рдореЗрдВ рд░рдЦрд╛ рд╣реИред responseTransformer
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ __headers
рдХрд╛ рдорд╛рди рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЪрд░ рдореЗрдВ рд░рдЦрд╛ рд╣реИ, рдФрд░ useQuery()
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЕрднреА рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдореБрдЭреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЪрд░ рдмрдирд╛рдирд╛ рд╣реИ ...
@blatoo , рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдореБрджреНрджрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИ, рдЗрд╕реЗ new ApolloLink
рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ
const paginationLink = new ApolloLink((operation, forward) => {
return forward(operation).map((response) => {
const context = operation.getContext();
const { headers } = context.restResponses[0] || null;
// in my case i'm making a bunch of sub queries, so i'm using `[0]` to get the headers from the top level.
if (headers) {
const pagination = getPaginationFromHeaders(headers.get('link'));
return { ...response, data: { ...response.data, pagination } };
}
return response;
});
});
const client = new ApolloClient({
cache: new InMemoryCache(),
link: concat(paginationLink, restLink),
});