простой провайдер данных отдыха не принимает данные Odata

Итак, API, который я использую, использует ODATA (https://www.odata.org/). В результате это то, как он выглядит, когда он возвращается

```

{"@odata.context":"http://localhost:5001/api/$metadata#apemp",
"value":[
{"EmpID":1,
"Abbr":"Admin",
"BadgeNo":null,
"ColorRef":0,
"ContactMethodID":null,
"DateHired":"2018-05-25T16:42:57-05:00"}

]```

наш поставщик данных выглядит так

import { stringify } from 'query-string';
import {
   fetchUtils,
   GET_LIST,
   GET_ONE,
   GET_MANY,
   GET_MANY_REFERENCE,
   CREATE,
   UPDATE,
   UPDATE_MANY,
   DELETE,
   DELETE_MANY
} from 'react-admin';

...
   const convertHTTPResponse = (response, type, resource, params) => {
      const { headers, json } = response;
      switch (type) {
         case GET_LIST:
            return { data: json };
         case GET_MANY_REFERENCE:
            if (!headers.has('content-range')) {
               throw new Error(
                  'The Content-Range header is missing in the HTTP Response. The simple REST data provider expects responses for lists of resources to contain this header with the total number of results to build the pagination. If you are using CORS, did you declare Content-Range in the Access-Control-Expose-Headers header?'
               );
            }
            return {
               data: json,
               total: parseInt(
                  headers
                     .get('content-range')
                     .split('/')
                     .pop(),
                  10
               )
            };
         case CREATE:
            return { data: { ...params.data, id: json.id } };
         default:
            return { data: json };
      }
   };

   return (type, resource, params) => {
      // simple-rest doesn't handle filters on UPDATE route, so we fallback to calling UPDATE n times instead
      if (type === UPDATE_MANY) {
         return Promise.all(
            params.ids.map(id =>
               httpClient(`${apiUrl}/${resource}/${id}`, {
                  method: 'PUT',
                  body: JSON.stringify(params.data)
               })
            )
         ).then(responses => ({
            data: responses.map(response => response.json)
         }));
      }
      // simple-rest doesn't handle filters on DELETE route, so we fallback to calling DELETE n times instead
      if (type === DELETE_MANY) {
         return Promise.all(
            params.ids.map(id =>
               httpClient(`${apiUrl}/${resource}/${id}`, {
                  method: 'DELETE'
               })
            )
         ).then(responses => ({
            data: responses.map(response => response.json)
         }));
      }

      const { url, options } = convertDataRequestToHTTP(type, resource, params);
      return httpClient(url, options).then(response =>
         convertHTTPResponse(response, type, resource, params)
      );
   };
};

поэтому прямо сейчас, когда я указываю этого поставщика данных на конечные точки api, он не выглядит так, как отформатирован код. Я получаю ошибку

«Ответ на 'GET_LIST' должен быть похож на {data: [...]}, но полученные данные не являются массивом. Возможно, dataProvider неверен для 'GET_LIST'»

Я широко использовал этот поставщик данных с нашим предыдущим API, который возвращал данные несколько иначе.

поскольку odata возвращает объект с контекстом и URL-адресом в качестве элементов, а значение с массивом в качестве второго элемента, это не работает.

Мне действительно просто нужен массив, но я не знаю, что мне написать, чтобы получить его.


person JohnD1986    schedule 05.12.2018    source источник


Ответы (1)


Я также реализую DataProvider для OData, и вам нужно "обернуть" данные вашего ответа, хранящиеся в value, объектом data.

Но массив находится в value prop, и вы не можете просто утверждать return { data: json };, как вы, потому что он ожидает объект вроде {data: [0: {prop1: "hello", prop2: "world"}, 1: {... }]} и вы возвращаете это:

{
  "@odata.context":"http://localhost:5001/api/$metadata#apemp",
  "value":[
     {
       "EmpID":1,
       "Abbr":"Admin",
       "BadgeNo":null,
       "ColorRef":0,
       "ContactMethodID":null,
       "DateHired":"2018-05-25T16:42:57-05:00"
     }
  ]
}

Итак, что вам нужно сделать, это присвоить значение prop ответа json, например:

return { data: json.value };

Так что на самом деле это довольно легко исправить

person Allwe    schedule 07.01.2019