tags:

views:

134

answers:

2

Hi,

I am planning to make an iPhone search app. the user types in the search string. the string will be searched by some search engines like Google, Live, Yahoo ...

I need to get the search result in the XML format. Is there any way to do this. Help needed. Please.

Thanks and regards, Shibin

+1  A: 

There are different web service API's available. I would recommend that you use those.

Google Search API: http://code.google.com/intl/sv-SE/apis/ajaxsearch/web.html

Google JS API's often return JSON. But that's easy to work with too. You should easily be able to transform the JSON to XML if needed.

Robin
Shibin Moideen
The error I get is that it is forbidden. Perhaps its a paid service or a service for devices to retrieve results from
Rudiger
+1  A: 

A RESTful search request to Google AJAX returns a response in JSON format. JSON is a like a very highly stripped-down version of XML.

Google doesn't make its SOAP interface available any longer, so I don't know if you'll be able to get XML from them, at least through a public interface. Luckily for you, JSON responses are trivial to request and to parse on the iPhone.

You can issue the request with ASIHTTPRequest and parse the JSON-formatted response on an iPhone with json-framework.

For example, to create and submit a search request that is based on the example on the Google AJAX page, you could use ASIHTTPRequest's -requestWithURL and -startSynchronous methods:

NSURL *searchURL = [NSURL URLWithString:@"http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton"];
ASIHTTPRequest *googleRequest = [ASIHTTPRequest requestWithURL:searchURL];
[googleRequest addRequestHeader:@"Referer" value:[self deviceIPAddress]]; 
[googleRequest startSynchronous];

You would build the NSURL instance based on your search terms, escaping the request parameters.

If I followed Google's example to the letter, I would also add an API key to this URL. Google asks that you use an API key for REST searches. You should sign up for an API key over here and add it to your requests.

You should also specify the referer IP address in the request header, which in this case would be the local IP address of the iPhone, e.g.:

- (NSString *) deviceIPAddress {
    char iphoneIP[255];
    strcpy(iphoneIP,"127.0.0.1"); // if everything fails
    NSHost *myHost = [NSHost currentHost];
    if (myHost) {
        NSString *address = [myHost address];    
        if (address)
            strcpy(iphoneIP, [address cStringUsingEncoding:NSUTF8StringEncoding]);
    }
    return [NSString stringWithFormat:@"%s",iphoneIP]; 
}

There are also asynchronous request methods which are detailed in the ASIHTTPRequest documentation. You would use those to keep the iPhone UI from getting tied up while the search request is made.

In any case, once you have Google's JSON-formatted response in hand, you can use the json-framework SBJSON parser object to parse the response into an NSDictionary object:

NSError *requestError = [googleRequest error];
if (!requestError) {
    SBJSON *jsonParser = [[SBJSON alloc] init];
    NSString *googleResponse = [googleRequest responseString];
    NSDictionary *searchResults = [jsonParser objectWithString:googleResponse error:nil];
    [jsonParser release];
    // do stuff with searchResults...
}
Alex Reynolds