Преодоление ограничений CORB для старого API? - PullRequest
0 голосов
/ 02 декабря 2018

Попытка разгрузить некоторую выборку обновленных позиций шины из NJTransit API здесь - http://mybusnow.njtransit.com/bustime/map/getRoutePoints.jsp?route=87 - которая возвращает довольно элементарный XML.Нет лучшего заголовка / политики CORS, насколько я могу судить, поэтому Chrome выдает ошибку и блокирует запрос с указателем на этот трекер проблем .

route='87';

function logResult(result) {
  console.log(result);
}

function logError(error) {
  console.log('Looks like there was a problem: \n', error);
}

function validateResponse(response) {
  if (!response.ok) {
    throw Error(response.statusText);
  }
  return response;
}

function readResponseAsXML(response) {
  let responseDoc = new DOMParser().parseFromString(response, 'application/xml');
  var oSerializer = new XMLSerializer();
  var buses_xml = oSerializer.serializeToString(responseDoc);
  return buses_xml;
}

function fetchXML(pathToResource) {
  fetch(pathToResource, {mode:'no-cors'}) // 1
  .then(validateResponse) // 2
  .then(readResponseAsXML) // 3
  .then(logResult) // 4
  .catch(logError);
}

fetchXML('http://mybusnow.njtransit.com/bustime/map/getRoutePoints.jsp?route='+ route);

Есть ли способ обойти это?Я знаю, что это проблема, связанная с браузером, и я могу позвонить с сервера, и все будет хорошо, но это именно то, от чего я пытаюсь отойти.Текущее решение получает эти обновления с сервера и передает их клиенту через мой собственный серверный API.Я хотел бы покончить с собой в качестве посредника и просто заставить клиентов самим получать обновленные позиции.

Вероятность получения источника данных (NJT) для внесения каких-либо изменений в их настройку API очень мала.

Спасибо

1 Ответ

0 голосов
/ 02 декабря 2018

Пожалуйста, проверьте это:

route='87';

function logResult(result) {
  console.log(result);
}

function logError(error) {
  console.log('Looks like there was a problem: \n', error);
}

function validateResponse(response) {
  if (!response.ok) {
    throw Error(response.statusText);
  }
  return response;
}

function readResponseAsXML(response) {
  let responseDoc = new DOMParser().parseFromString(response, 'application/xml');
  var oSerializer = new XMLSerializer();
  var buses_xml = oSerializer.serializeToString(responseDoc);
  return buses_xml;
}

function fetchXML(pathToResource) {
  fetch(pathToResource, {}) // 1
    .then(validateResponse) // 2
    .then(readResponseAsXML) // 3
    .then(logResult) // 4
    .catch(logError);
}

fetchXML('https://cors-anywhere.herokuapp.com/http://mybusnow.njtransit.com/bustime/map/getRoutePoints.jsp?route='+ route);

Я изменил ваш код для использования прокси-сервера CORS.

Пожалуйста, отметьте @ CodePen: https://codepen.io/animatedcreativity/pen/b5796c4b3711b6f8d6437beff0c2c40a

Пример ответа XML:

<route>
        <id>87</id> 
        <rtpiFeedName></rtpiFeedName>
        <sn>87</sn> 
        <nm>87 Jersey City - Hoboken</nm> 
        <displayDesignator>87</displayDesignator> 
        <vmode>1</vmode>   

        <sbs>



        </sbs>

        <c>#ff0033</c>

        <pas>


            <pa>
                <id>3393</id>

                <d>Hoboken</d> 
                <dd>Hoboken</dd>  
                <directionRtpiFeedName></directionRtpiFeedName>

                <pt>
                    <lat>40.692060000000545</lat>
                    <lon>-74.0966800000009</lon>
                    <dtr>false</dtr> 

                    <bs>
                        <id>21028</id>
...
...