USPS HTTP Post Request - PullRequest
       3

USPS HTTP Post Request

0 голосов
/ 25 ноября 2018

Вот сообщение об ошибке, которое я получаю, когда пытаюсь запустить следующий код Perl.Есть идеи, что вызывает это?Похоже, он не похож на API = Verify, но это было единственное имя для API, которое возвращает 9-значный почтовый индекс, который я смог найти.

80040B1AAPI Ошибка авторизации.не является допустимым именем API для этого протокола .USPSCOM :: DoAuth

# Perl subroutine for POST Request
#########
sub FindTracking() {
$saddress="60 Passional Way";
$scity="Burnsville";
$szip="27690";
$sstate="NC";
print "start of tracking...<br>";

$queryString = qq~
<?xml version="1.0"?>
https://secure.shippingapis.com/ShippingAPI.dll?API=Verify&XML=        
<AddressValidateRequest USERID="xxxxxxx">
<Revision>1</Revision>
<Address ID="0">
<Address1></Address1>
<Address2>$saddress</Address2>
<City>$scity</City>
<State>$sstate</State>
<Zip5>$szip</Zip5>
<Zip4></Zip4>
</Address>
</AddressValidateRequest>
<?xml version="1.0"?>
<AddressValidateResponse><Address ID="0">
<Address2></Address2><City></City><State></State><Zip5></Zip5>
<Zip4></Zip4></Address></AddressValidateResponse>
<Error>
<Number></Number>
<Source></Source>
<Description></Description>
<HelpFile></HelpFile>
<HelpContext></HelpContext>
</Error>
~;

# Instantiate the user agent and set our agent string
$userAgent = new LWP::UserAgent;
$userAgent->agent( 'USPS' );
$queryString =~ s/ /\%20/ig;
$request = new HTTP::Request( 'POST',      
'https://secure.shippingapis.com/ShippingAPI.dll' );

# Set the content type
$request->content_type( 'text/xml' );

# Set the query string
$request->content( $queryString );

# Make the request
$response = $userAgent->request( $request );
print $response->content();
# Check the status of the request
if ( $response->is_success ) {
    $content = $$response{ "_content" };
  $TrackingNumber = "";
  ($success) = $content =~ /\<AddressValidateRequest\>(.*)\    
 <\/AddressValidateRequest\>/;
  print "<br><br>==>some $content<br>";
  if ($success eq "Success") {
    ($TrackingNumber)= $content =~ /\<Zip4\>(.*)\<\/Zip4\>/;
   print "here with $TrackingNumber<br>";
   }

}
else {
  print "<br><br>here with resp=$response<br>req=$request <br>cont     
$content";
}
}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Измените XML вашего запроса на:

$queryString = qq~
<AddressValidateRequest USERID="xxxxxxxxxxx">
<Revision>1</Revision>
  <Address ID="0">
    <Address1></Address1>
    <Address2>$saddress</Address2>
    <City>$scity</City>
    <State>$sstate</State>
    <Zip5>$szip</Zip5>
    <Zip4></Zip4>
  </Address>
</AddressValidateRequest>
~;

Затем создайте запрос как GET вместо POST:

$userAgent = new LWP::UserAgent;
$userAgent->agent( 'USPS' );
$url = "https://secure.shippingapis.com/ShippingAPI.dll?API=Verify&XML=$queryString";

$request = new HTTP::Request( 'GET',  $url );
0 голосов
/ 25 ноября 2018

Для начала у вас неверная строка запроса.Сравните то, что вы делаете, с примером USPS WebTools и удалите то, что они не показывают.Убедитесь, что вы правильно настраиваете свой USERID (и не используете «xxxxxxx»);здесь полезна переменная окружения.

Или вы можете попробовать использовать модуль Business :: USPS :: WebTools из GitHub.Он реализует поиск по почтовому индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...