Скрипт Google Apps API проверки адреса USPS

Я пытаюсь вызвать API проверки адреса USPS из скрипта Google Apps. Для этого требуется XML, с которым я неопытен по сравнению с JSON. Вот еще один похожий вопрос stackoverflow (Как получить тарифы на доставку внутри страны через API USPS с помощью скрипта Google Apps?), и я дописал его до буквы "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>

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

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


person Chris    schedule 18.04.2020    source источник


Ответы (1)


Я понял, в чем проблема. Моя единственная реальная проблема заключалась в том, что у меня был неправильный закрывающий XML-тег. Это должно быть ‹ /AddressValidateRequest > вместо ‹ /AddressValidationRequest >. ТАКЖЕ необходимо включить самозакрывающийся тег ‹ Address1/ > перед ‹ Address2 > и ‹ Zip4/ > после ‹ /Zip5 >. Это выдаст ошибку, если вы этого не сделаете.

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

      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)
person Chris    schedule 19.04.2020