Does anyone have a slightly more cutomizable rest-api data provider ?

The built in simple-REST is very constricting. Querying /resource/id/sub-resource Isn't possible AFAIK . Do you just write your own instead?
2 Replies
kapa.ai
kapa.ai4w ago
Hi @Todilo. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- Yes, it's possible to customize the REST API data provider in refine to handle more complex API structures like /resource/id/sub-resource. You have a few options: 1. Customize the existing simple-rest data provider: You can swizzle the @refinedev/simple-rest data provider and modify it to suit your needs. This allows you to customize specific methods without rewriting the entire data provider. Here's how to do it (https://refine.dev/docs/data/packages/simple-rest/#customizing-the-data-provider-). 2. Override specific methods: You can override specific methods of the data provider using the spread syntax. This is useful when you only need to change a particular function. Here's an example (https://refine.dev/docs/guides-concepts/faq/#how-i-can-override-specific-function-of-data-providers). 3. Create a custom data provider: If you need more extensive customization, you can create a custom data provider from scratch. This gives you full control over how API requests are handled. You can refer to the tutorial for more information (https://refine.dev/tutorial/essentials/data-fetching/intro/#creating-a-data-provider). For your specific case of querying /resource/id/sub-resource, you could customize the getOne method of the data provider to handle this structure. Here's a basic example of how you might do this:
import dataProvider from "@refinedev/simple-rest";

const customDataProvider = {
...dataProvider("API_URL"),
getOne: async ({ resource, id, meta }) => {
const url = meta?.subResource
? `${apiUrl}/${resource}/${id}/${meta.subResource}`
: `${apiUrl}/${resource}/${id}`;

const { data } = await httpClient.get(url);

return {
data,
};
},
};

<Refine dataProvider={customDataProvider} />
import dataProvider from "@refinedev/simple-rest";

const customDataProvider = {
...dataProvider("API_URL"),
getOne: async ({ resource, id, meta }) => {
const url = meta?.subResource
? `${apiUrl}/${resource}/${id}/${meta.subResource}`
: `${apiUrl}/${resource}/${id}`;

const { data } = await httpClient.get(url);

return {
data,
};
},
};

<Refine dataProvider={customDataProvider} />
This approach allows you to maintain the functionality of the simple-rest data provider while adding the flexibility to handle sub-resources when needed. Data Provider Customization (https://refine.dev/docs/data/data-provider/#faq) Remember, the level of customization you need will determine which approach is best for your use case. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai4w ago
<@207945811592478720> Kapa.ai is still learning and improving, please let me know how I did by reacting below.