API проверки подлинности адреса USPS Script - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь вызвать API проверки адресов USPS из скрипта Google Apps. Требуется XML, с которым я неопытен по сравнению с JSON. Вот еще один вопрос о стекопереработке, который похож ( Как я могу получить домашнюю c стоимость доставки через API USPS с помощью Google Apps Script? ), и я обозначил его буквой "t", но это достаточно разные, и когда он адаптирован для API проверки адресов USPS, он не работает для меня. Я зарегистрировался для идентификатора пользователя и получил подтверждение от USPS.

Вот документация API проверки адреса USPS: https://www.usps.com/business/web-tools-apis/address-information-api.htm#_Toc34052588.

Вот мой скрипт приложения Код (с измененным идентификатором пользователя USPS для конфиденциальности):

      var site = 'https://secure.shippingapis.com/ShippingAPI.dll';

      var userid = "999ABCDE9999";

      var payload = {
        "API": "Verify",
        "XML" : "<AddressValidateRequest USERID=\"" + userid + "\"> \
                 <Revision>0</Revision> \
                 <Address ID=\"0\"> \
                 <Address2>" + address1 + "</Address2> \
                 <City>" + city1 + "</City> \
                 <State>" + state1 + "</State> \
                 <Zip5>" + zip1 + "</Zip5> \
                 </Address> \
                 </AddressValidationRequest>"
      };

      var options = {
        method: "POST",
        payload: payload
      }

      Logger.log('payload = ' + JSON.stringify(payload));

      var response = UrlFetchApp.fetch(site, options);

      var xmlreturn = response.getContentText();

      Logger.log('return xml = ' + xmlreturn);

Вот мои журналы (с изменением адреса улицы также для конфиденциальности:

payload = {"API":"Verify","XML":"<AddressValidateRequest USERID=\"999ABCDE9999\">                  <Revision>0</Revision>                  <Address ID=\"0\">                  <Address2>123 AnyStreet Dr</Address2>                  <City>Forney</City>                  <State>TX</State>                  <Zip5>75126</Zip5>                  </Address>                  </AddressValidationRequest>"}

return xml = <?xml version="1.0" encoding="UTF-8"?>
<Error><Number>80040B19</Number><Description>XML Syntax Error: Please check the XML request to see if it can be parsed.(B)</Description><Source>USPSCOM::DoAuth</Source></Error>

Это возврат / результат я получаю независимо от того, что я пытаюсь сделать. Я думаю, что, возможно, проблема может заключаться в том, что полезная нагрузка. XML включает в себя USERID = \ "999ABCDE9999 \" вместо того, что в документации сказано - USERID = "999ABCDE9999" (без бэкслы sh), но я не знаю, как от них избавиться (и пытался).

Спасибо за помощь!

1 Ответ

0 голосов
/ 19 апреля 2020

Я понял, в чем проблема. Моя единственная реальная проблема заключалась в том, что у меня был неверный закрывающий тег XML. Это должно быть вместо . Вам также необходимо включить самозакрывающийся тег перед и после </ Zip5>. Если вы этого не сделаете, будет выдано сообщение об ошибке.

Однако я рад, что у меня возникла проблема, и разместил ее здесь, так что, надеюсь, это поможет другим в будущем получить код в значительной степени он понадобится вам для запроса валидации USPS от Google Apps Script. Я не нашел этого нигде. Вот окончательный код, затем я расскажу о том, как я работал с приведенным ниже результатом.

      var userid = 'Enter the ID USPS Gave you when you signed up here';

      var url = 'https://secure.shippingapis.com/ShippingAPI.dll';

      var payload = {
        "API": "Verify",
        "XML" : "<AddressValidateRequest USERID=\"" + userid + "\"> \
                 <Revision>1</Revision> \
                 <Address ID=\"0\"> \
                 <Address1/> \
                 <Address2>" + address1 + "</Address2> \
                 <City>" + city1 + "</City> \
                 <State>" + state1 + "</State> \
                 <Zip5>" + zip1 + "</Zip5> \
                 <Zip4/> \
                 </Address> \
                 </AddressValidateRequest>"
      };

      var options = {
        "method": "POST",
        "payload": payload,
        muteHttpExceptions: true
      }

      // Use a try & catch routine to catch any major errors.
      try {
        var response = UrlFetchApp.fetch(url, options);
      }
      catch (e) {
        Logger.log(e);
        continue;         // If there is an error (i.e. the API service is not available), then skip the rest of the logic for this row.
      }

      var xmlReturn = response.getContentText();

Как только вы получите "xmlreturn" (как я это назвал выше) из выборки, вы Вам нужно будет проанализировать ответ XML, чтобы получить каждый фрагмент адреса, возвращаемый из USPS. Вот как я это сделал, используя регулярное выражение для Адресной строки 2. Вы делаете то же самое в значительной степени для других частей, просто слегка изменив свое регулярное выражение.

        // *********************************
        // Get Address Line 2
        // *********************************

        var uspsAddress2Reg = /(?<=<Address2>)[^]+(?=<\/Address2>)/g;
        var uspsAddress2Arr =xmlReturn.match(uspsAddress2Reg);

        // If we found the Address Line 2 in the following format: <Address2>1234 ANYSTREET DRIVE</Address2>

        if (uspsAddress2Arr != null) {

          var uspsAddress2 = uspsAddress2Arr[0];

        } else {

          var uspsAddress2 = '';           // If not found, set it to blank.

        }  // End If (uspsAddress2Arr != null)
...