React Native fetch,意外令牌

时间:2017-04-07 13:58:08

标签: android react-native fetch-api

我正在尝试使用 React Native 中的 fetch api 来调用简单的REST服务。我在 Android 上运行该应用。

当我致电await response.json()时,我得到了

  

位于0的JSON中的意外标记<

,我也尝试了await response.text(),我得到了这个结果:

  

Mn0B [CBNU?@ +bLRҌBR。   ħծ͛#&GT; GT%{Z؄U&GT; FS0 ]����H��'&��u�Z}��y�Z��2����i�d�G�>����R����6LL{j�j�7\���������d���L.���gٲXv�Lf��g�%T�~�\z�U8E܀���ڭ�c��@[G�;�T�������{�*�9�)��a½ ���0�组V:ϒ���/�K��3�ݝ����W: c�^UV@�B�7�@�v �+WG��@YL�|Ġ>q�=@�J}�3=��Q�]Հup^E�0 ^d'Ա �^���b�.��2,м���g2��R<���_rpV:!��<��^>�����{�e�#7m���nA�;n�������l�o�u��kW���r

这是我正在使用的代码:

export function fetchMenu() {
  return async(dispatch) => {
    try {
      dispatch(menuRequest(true));
      console.log(Institucion.aplent);
      var response = await fetch('http://<page_url>/api/moviles/personalizacion', {
        compress: true,
        headers: {
          'aplentId' : Institucion.aplent,
          'Accept-Encoding' : 'gzip,deflate'
        }
      });
      console.log(response);
      if(!response.ok) throw Error(response.statusText);
      var data = await response.json();
      console.log('Data:', data);
      dispatch(menuSuccess(data));
    }
    catch(ex) {
      console.log(ex);
      dispatch(menuFailure(ex));
    }
  };
}

注意:出于安全原因,我已更改了网址,但我在代码中输入了正确的网址。

我尝试使用和不使用Accept-Encoding标头,结果相同。

修改

如果我在REST API中禁用deflate压缩(在服务器上)它可以正常工作,不能获取支持deflate压缩吗?

3 个答案:

答案 0 :(得分:2)

将这些标题添加到fetch调用中以确保您收到JSON:

 'Content-Type': 'application/json',
  'Accept': 'application/json',

答案 1 :(得分:0)

我建议在没有明确设置压缩的情况下查看它是否有效。

如果您未设置Accept-encoding标头,则本机应自动压缩并解压缩。所以可能让它处理它。而是尝试将其更改为Accept标题

export function fetchMenu() {
  return async(dispatch) => {
    try {
      dispatch(menuRequest(true));
      console.log(Institucion.aplent);
      var response = await fetch('http://<page_url>/api/moviles/personalizacion', {
        headers: {
          'aplentId' : Institucion.aplent,
          'Accept' : 'application/json'
        }
      });
      console.log(response);
      if(!response.ok) throw Error(response.statusText);
      var data = await response.json();
      console.log('Data:', data);
      dispatch(menuSuccess(data));
    }
    catch(ex) {
      console.log(ex);
      dispatch(menuFailure(ex));
    }
  };
}

答案 2 :(得分:0)

这是一个服务器端问题,我更改了api的压缩算法,并且运行良好