Archive for the ‘WeoGeo API’ 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.

WeoGeo API: Python Examples, Part 2

Tuesday, January 12th, 2010

The Developer Documentation for WeoGeo’s API provides examples using curl.  In this blog series, I’m providing similar examples but using Python.  In WeoGeo API: Python Examples, Part 1, I showed how to invoke the “GET Dataset as WeoFile” API from Python using urllib.  This time, I’ll show the same request using httplib.

Httplib is a little more complicated but it handles authentication slightly better and, more importantly, specifying the headers will enable more sophisticated requests (that will be required for later API examples).

The curl example for the API call is below:

List Datasets API: curl example

And here is a bare-bones example of that request in Python using httplib:

import base64
import string
import httplib, urllib

usern = "your_username" # or your API key
passw = "your_password" # if API Key is used: = ""
library = "the * part of your Library's domain name in *.weogeo.com"

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

# List Datasets (GET) curl example
# curl -H 'Content-Type: application/xml' http://#{hostname}/datasets.weo?page=1&east=0&north=90&south=0&west=-180&scale=5

# Optional parameters:
params = urllib.urlencode({
 'page': '1',
 'per_page': '15',
 'north': '90.0',
 'south': '-90.0',
 'east': '180.0',
 'west': '-180.0',
 'date_from': '1990-01-01',
 'date_to': '2010-01-01',
 'data_type': 'RASTER',
 'min_provider_rating': '0',
 'min_dataset_rating': '0',
 'tags': 'test'
})

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

# create teh connection
conn = httplib.HTTPConnection("dandye.weogeo.com")

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

# call the URI
response = conn.getresponse()

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

# read the data retreieved
data = response.read()

# close the connection
conn.close()

# print the data retreieved
print data

Notice on Line 9 that your username and password are base64 encoded.  This is basic access authentication and encoding != encrypting.  So for added security, you may use your Library API Key in place of your username and leave your password blank (password = “”).

Again, for extra credit, try changing the extension (on line 40) from “.weo” to [".kml",".json",".rss"].

WeoGeo API: Python Examples, Part 1

Thursday, January 7th, 2010

The Developer Documentation for WeoGeo’s API provides examples using curl:

curl example in WeoGeo Developer Documentation (wiki.weogeo.com)

curl example in WeoGeo Developer Documentation (wiki.weogeo.com)

However, after fielding some questions from Developers, I’m thinking some Python (and C#?) examples might be useful too.  So here is the first installment.

This is a bare-bones example of the List Datasets API, which returns a list of Datasets within the (optional) defined parameters.  Possible parameters include a Minimum Bounding Rectangle (MBR), date range, ratings, and/or Tags.

import urllib

usern = [your WeoGeo username]
passw = [your WeoGeo password]
library = [the * part of your Library's domain name *.weogeo.com]

# List Datasets (GET) curl example:
# curl -H 'Content-Type: application/xml' http://#{hostname}/datasets.weo?page=1&amp;east=0&amp;north=90&amp;south=0&amp;west=-180&amp;scale=5

# Optional parameters:
params =  urllib.urlencode(
    {
        'page': 1,
        'per_page': '15',
        'north': '90.0',
        'south': '-90.0',
        'east': '180.0',
        'west': '-180.0',
        'date_from': '1990-01-01',
        'date_to': '2010-01-01',
        'data_type': 'RASTER',
        'min_provider_rating': '0',
        'min_dataset_rating': '0',
        'tags': 'test'
    }
)

# construct the URI for the API with parameters:
url = "https://%s:%s@%s.weogeo.com/datasets.weo?%s" % (usern,passw,library,params)

# call the URI
f = urllib.urlopen(url)

# print results to the CLI
print f.read()

For extra credit, try changing the extension from “.weo” to [".kml",".json",".rss"].

Next time, I’ll show the same WeoGeo API call in Python but use httplib instead of urllib.  Although, urllib is simpler, httplib handles authentication better and enables the more sophisticated requests that will be required for later API examples.