Ошибка Почты Канады в Ионном Проекте Ответ на предпечатную проверку имеет недопустимый код состояния HTTP 500 - PullRequest
0 голосов
/ 07 июня 2018

Я работаю над HTTP-запросом, который отправляет POST-запрос в API Почты Канады для запроса предложений о доставке:

getRates(weight: number, originPostal, destPostal) {
    const options = {
      headers: new HttpHeaders({
        'Authorization': 'Basic ' + btoa(this.TEST_USERNAME + ':' + this.TEST_PASSWORD),
        'Accept': 'application/vnd.cpc.ship.rate-v3+xml',
        'Content-Type': 'application/vnd.cpc.ship.rate-v3+xml',
        'Accept-language': 'en-CA',
      }),
    };

    const body = `
    <?xml version="1.0" encoding="utf-8"?>
      <mailing-scenario xmlns="http://www.canadapost.ca/ws/ship/rate-v3">
        <customer-number>${this.TEST_NUMBER}</customer-number>
        <parcel-characteristics>
        <weight>${weight}</weight>
        </parcel-characteristics>
        <origin-postal-code>${originPostal}</origin-postal-code>
        <destination>
          <domestic>
            <postal-code>${destPostal}</postal-code>
          </domestic>
        </destination>
      </mailing-scenario>
    `;

    return this.http.post<any>(this.TEST_URL, body, options)
}

Запрос работает на Postman и не работает на проекте Ionic (ionic serve и ionic run -l).Я искал в Интернете, и это - ошибка CORS Http-ответ об ошибке (неизвестный URL): 0 Неизвестная ошибка , я добавил ниже в ionic.config.json файл

  "proxies": [
    {
      "path": "/price",
      "proxyUrl": "https://ct.soa-gw.canadapost.ca/rs/ship/price"
    }
  ]

Ключ API,URL предоставлены Почтой Канады, которую можно найти здесь

У меня есть ошибки:

Не удалось загрузить https://ct.soa -gw.canadapost.ca / rs / ship / price : Ответ на предпечатную проверку имеет недопустимый код состояния HTTP 500.

14:32:24.786 shipping.ts:34 {"headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"status":0,"statusText":"Unknown Error","url":null,"ok":false,"name":"HttpErrorResponse","message":"Http failure response for (unknown url): 0 Unknown Error","error":{"isTrusted":true}}

Любая помощь приветствуется!

Обновление наИюнь 15,2018:

Сегодня я попробовал это на реальном устройстве, получаю такую ​​ошибку: enter image description here

проблема с предпечатной реакцией с ionic3приложение только на ios build [решено] и Ionic UIWebView , к сожалению, запрос все равно выдает такую ​​же ошибку ...

1 Ответ

0 голосов
/ 20 июня 2018
getRates(weight: number, originPostal, destPostal) {
    this.http.setDataSerializer('utf8');
    return this.http
      .post(
        this.URL,
        this.body(weight, originPostal, destPostal),
        this.headers(this.USER_NAME, this.PASSWORD)
      );
  }

  private headers(username, password) {
    return {
      'Authorization': 'Basic ' + btoa(username + ':' + password),
      'Accept': 'application/vnd.cpc.ship.rate-v3+xml',
      'Content-Type': 'application/vnd.cpc.ship.rate-v3+xml;',
      'Accept-language': 'en-CA'
    };
  }

  private body(weight, originPostal, destPostal) {
    return `<?xml version="1.0" encoding="utf-8"?>
    <mailing-scenario xmlns="http://www.canadapost.ca/ws/ship/rate-v3">
    <customer-number>MY_CUSTOMER_NUMBER</customer-number>
      <parcel-characteristics>
        <weight>${weight}</weight>
      </parcel-characteristics>
      <origin-postal-code>${originPostal}</origin-postal-code>
        <destination>
          <domestic>
            <postal-code>${destPostal}</postal-code>
          </domestic>
        </destination>
    </mailing-scenario>`;
  }

Есть пара вопросов, чтобы запрос не работал:

  1. Модуль HttpClient (угловой модуль) в ionic всегда имеет CORS, команда ionic имеет ответы на часто задаваемые вопросы.В моем случае я использую firebase в качестве бэкэнда, поэтому не очень часто использую http, я решил переключиться на Ionic Native Http
  2. XML-вопрос, перед тегом <?xml> стоит пробел, которыйЯ не осознавал, пока не распечатал детали сообщения об ошибке (само сообщение об ошибке было также в XML, остальное пропускало, поэтому вначале я думал, что у него только сообщение об ошибке Сервер , как только я вырезалсообщение целиком разбить на части и распечатать на консоли, я обнаружил, что это был недопустимый формат xml, а затем выяснил, что есть пробел): Error

Преобразование XML вJSON (xml2js облегчает жизнь):

import * as xml2js from 'xml2js';

this.rateProvider.getRates(this.totalWeight, this.ORIGINAL_POSTAL_CODE, this.selectedAddress.postalCode.toUpperCase())
  .then(resp => {
    xml2js.parseString(resp.data, (err, jsonResp) => {
      this.quotes = this.extractQuotes(jsonResp);
      this.presentActionSheet(this.quotes);
      this.isSelected = false;
    });
  })
  .catch(error => {
    console.log(error);
  });

Наконец-то, заработайте: enter image description here

...