Making web service APIs behave the same
YSM and Google’s account management APIs look incredibly different but do, essentially, the same thing. That is, allow you to manage your SEM campaigns through a web service. Ask Jeeves has a sponsored listings product with an API for larger advertisers and MSN will soon be releasing it sponsored search product. So, how are you going to keep a similar programming interface across all of these products? I’ll tell you how I’m doing it.
Essentially, these web services boil down to a CRUD (Create, Retrieve, Update, Destroy) service for your search advertising campaigns. So, why not create a class that does all of these things for each part of a campaign?
Firstly, I want to express the way of handling CRUD that is the most intuitive to me. I use four methods in all of my classes. There are:
new() or new(ID):
Instantiates an empty object or tries to instantiate a populated object if an ID is supplied. Dies if the ID does not exist.
exists(ID):
Instantiates an object with the ID supplied or returns false.
remove():
Deletes the object.
save():
Creates the object if none exists yet or updates it if it already exists.
For Google, I’ve written 5 classes:
- Account
- Campaign
- AdGroup
- Creative
- Keyword
For YSM, there are only 3 classes:
- Account
- Category
- Listing
This allows for code that looks kind of like this (in Perl, by the way):
#Get the ad group
my @ags = Google::AdGroup->getAll;
my $ag = pop @ags;
#Make the keyword
my $kw = new Google::Keyword;
$kw->maxCpc(40000); #microns, remember
$kw->text('somethin');
$kw->destinationUrl('http://www.example.com');
#Save the keyword in the ad group
$ag->addKeyword($kw);
More intuitive, don’t you think?