I am hooking up with the USPS rate calculator so I can calculate
shipping costs online. Unfortunately, USPS uses neither XML-RPC or
SOAP. I send the data via a GET request (a long URL) and I get data
back via xml. Questions:
1) Is there a library or something within the rails platform that
allows me to send a get request?
2) Is there a library that allows me to parse the resulting XML data?
Never used it, but rexml maybe...
http://www.germane-software.com/software/rexml_doc/
http://www.germane-software.com/software/rexml/docs/tutorial.html
A POST works just fine with the USPS webtools api. It's just not
evident from the documentation. Just post the data like you would for
a regular form post using application/x-www-form-urlencoded as the
content type.
Chris
Can you at least point me in the right direction?
Use something like net/https to do the POST. The only strange thing
is that while the content type is application/x-www-form-urlencoded,
you don't want to actually urlencode any of the data.
Here is a page that shows how it's done in perl.
I figured out a way to write a script to get the info I needed from
USPS web tools. I used rexml and net/http plugins. I thought I would
contribute code to this group because there doesn't seem to be much
support on the usps site for ruby. I searched online and couldn't find
any scripts either. Anyway, here you go:
(PS, please don't make fun of this code, I am new to ruby. However,
this code seems to work for me).
#! /usr/bin/ruby
# ************************************************************
# The purpose of this script is to find out how much it costs
# to send a package through USPS through a pre-defined
# criteria
# ************************************************************
# *** Define variables here ***
userid = "577MODEL4495"
service = "PRIORITY"
zip_origination = "10022"
zip_destination = "20008"
pounds = "10"
ounces = "5"
container = "Flat Rate Box"
box_size = "REGULAR"
# Administrative
require 'uri'
require 'net/http'
require "rexml/document"
include REXML
# Prepares the xml request for sending
xml_request = <<END
<RateV2Request USERID="#{userid}">
<Package ID="0">
<Service>#{service}</Service>
<ZipOrigination>#{zip_origination}</ZipOrigination>
<ZipDestination>#{zip_destination}</ZipDestination>
<Pounds>#{pounds}</Pounds>
<Ounces>#{ounces}</Ounces>
<Container>#{container}</Container>
<Size>#{box_size}</Size>
</Package>
</RateV2Request>
END
xml_request = xml_request.gsub(/[\t\r\n]/,'')
# Sends the xml request to USPS
host = 'testing.shippingapis.com'
path = "/ShippingAPITest.dll?API=RateV2&XML=" +
"#{URI.encode(xml_request)}"
xml_response = Net::HTTP.get host, path
# Parses the returned xml response
parsed = Document.new xml_response
puts parsed.elements['//RateV2Response/Package/Postage/Rate'].text