Archive for the ‘Python’ Category

WeoGeo API: Python Examples, Part 4 (PUTting XML)

Thursday, January 21st, 2010

In this blog series, we’ve looked at WeoGeo API examples using the GET and POST HTTP Verbs.  These were used to GET a List of Datasets and to POST a request for new Tokens in a WeoGeo Library.  Today, we’re going to PUT an XML file in order to update the Name, Description, and Tags associated with a Dataset.

First, let’s take a look at the dataset to be updated.  This Listing on my WeoGeo Library has dummy descriptive data for the name, description, and tags:

Panel 4: Preview with dummy data

Using the GET Dataset as WeoFile API in a web-browser, we can view this descriptive data as XML:

GET Dataset as WeoFile

For the new values, I’ve created an XML file that contains the dataset tag and child nodes for each of the fields that I want updated:

new values in xml

I’ve saved that file locally to my local file system and will read it from the following Python script:

import base64
import string
import httplib, urllib

# Programmer defined variables
usern = "your api key"
passw = "" # Null string when API Key is used
library = "yourLibraryDomain" # the %s part of %s.weogeo.com
token = "the dataset token"
new_xml = "./data/new_xml.xml"  #path in my file-system
# No more programmer changes

# set up the authentication string
auth = 'Basic ' + string.strip(base64.encodestring(usern + ':' + passw))

# create the header with the authentication string
headers = {
 "Content-Type": "application/xml" ,
 "Authorization": auth,
 }

# read the XML data into body and print it
body = open(new_xml).read()
print body

# create the connection
conn = httplib.HTTPSConnection("%s.weogeo.com" % library)

# Construct the request with headers and XML in the body
conn.request("PUT","/datasets/%s.weo" % token, body, headers)

# call the URI
response = conn.getresponse()

#check status of response
print response.status, response.reason

# store the response in data
data = response.read()

# close the connection
conn.close()

# output the results
print data

This is very similar to the last example but note the following changes:

  1. the HTTP verb PUT is used in place of POST
  2. the variable body is used on line 29 where a null string was used before

Calling this Python script from the console outputs the following:

 S:\>python put_example.py
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
 <name>Counties in the Southeast</name>
 <description>
 <![CDATA[
 <h1>Big Header<h1>
 Some <i>HTML</i> elements like <b>bold text</b> and
 <a href="http://blogs.weogeo.com/dandye">links</a> are allowed.
 ]]>
 </description>
 <tags>TIGER shapefile political_boundaries counties</tags>
</dataset>
200 OK

S:\>

The 200 response indicates that all went well with the update and we can verify that by looking at the updated listing in the Preview Panel:

Panel 4: Preview with updated data

WeoGeo API: Python Examples, Part 3

Tuesday, January 19th, 2010

The Developer Documentation for WeoGeo’s API provides examples using curl.  In this blog series, I’m providing similar examples using Python.  In WeoGeo API: Python Examples, Part 1, I showed how to invoke the “GET Dataset as WeoFile” API from Python using urllib.  In Part 2, I showed the same GET Dataset request using httplib.  This time, we’re going to generate Dataset Tokens, which will require use of POST and https.

First, a little background: Dataset Tokens are Universally Unique Identifiers.  There is one Dataset Token for each Dataset Listing in your WeoGeo Library.  If your Dataset is also listed on the WeoGeo Market, the same Token is used there.  Although the WeoApp can create Dataset Tokens for you when it creates a Dataset WeoFile, sometimes developers find it is useful to create a number of them in advance.

The Developer API Documentation shows that the curl request for Dataset Token generation is:

curl -u ${api_key}: -X POST https://${hostname}/datasets/tokens?count=2

There are three things of note here:

  1. For authentication, only the API Key is used
  2. The HTTP method is POST where previous examples have used GET
  3. This API uses https rather than http

Here is a bare-bones Python example demonstrating the same API call:

import base64
import string
import httplib, urllib

# Programmer defined variables
usern = "your API key goes here"
passw = "" # Null string when API Key is used
library = "YourLibraryName" # the %s part of %s.weogeo.com
n_tokens = 2
# No more programmer changes

# set up the authentication string
auth = 'Basic ' + string.strip(base64.encodestring(usern + ':' + passw))

# Generate Tokens Curl Example (POST via HTTPS)
# curl -u #{api_key}: -X POST https://#{hostname}/datasets/tokens?count=2

# create the header with the authentication string
headers = {
 "Content-Type": "application/xml" ,
 "Authorization": auth,
 }

# set parameters for the request
params =  urllib.urlencode( { 'count':n_tokens } )

# create the connection
conn = httplib.HTTPSConnection("%s.weogeo.com" % library)

# Construct the request with headers amd add paramters to the URI
conn.request("POST","/datasets/tokens?%s" % params, "", headers)

# call the URI close the connection
response = conn.getresponse()

#check status of result
print response.status, response.reason

#check status of result
data = response.read()

# close the connection
conn.close()

# output the results
print data

For the three things of interest noted above:

  1. API Key is set on line 5 and used on lines 11, 17, and 28
  2. Line 28 sets the HTTP Request Method to POST
  3. Line 25 uses httplib.HTTPSConnection (previous examples used httplib.HTTPConnection)

That’s it!  Next time, I plan to show the PUT method as used in the Update Dataset API.