views:

142

answers:

3

I am getting started with iPhone application development and would like to create an application that involves pulling data from from a web application. I will be developing the API using PHP and the Zend Framework. I have never created a public API before, nor an iPhone app that works with public data.

Here are some specific questions I have:

One of the things I will need to do is create a table view with data from the API.

  • What data format should my API return? XML, JSON, HTML? (I'm assuming XML will be the easiest)

Let's say my API has a fetchAll function which returns all the records in a database table, how should I format this data so it is easy to work with in my iPhone application?

# http://myapp.com/api/people/fetchAll
array(
    0 => 'John',
    1 => 'Sally',
    2 => 'Chris'
)

Update: After doing some research I decided that (on the Server-side) I want to implement a RESTful API that returns JSON. So my iPhone application will ultimately be a REST client.

I also found this post, though it may be outdated now: Creating RESTful Web Service Clients in Cocoa and Cocoa Touch

+4  A: 

I would recommend using JSON.

On the server, you would want to return the data in a JSON format from your "fetchAll" request.

On the iPhone client app, after getting the data from the request (try the ASIHTTPRequest library), you can parse the JSON using a library such as TouchJSON.

gerry3
Definitely second the choice of JSON. There is currently no more highly-supported a data interchange format between disparate languages than JSON. I've used it for ObjC<->Perl communication for a long time with no snags. Plus, it's compact, so it's cheap!
rpj
"There is currently no more highly-supported a data interchange format between disparate languages than JSON." I don't agree. XML is more highly-supported. For example, XML parsing is supported out of the box on the iphone but JSON requires a 3rd party library.
Jay
True Jay, but still, working with JSON on the iphone is way easier than working with XML, which sucks in Obj-c.
Tyler Egeto
Use JSON. First, JSON uses a smaller size than XML to represent the same data, and also, TouchJSON parsing is faster than using NSXMLParser (don't know about TouchXML or libxml2).
Adrian Kosmaczewski
A: 

Check out the Objective Resource project. It works out of the box with rails, but will work with any site that uses ActiveResource conventions.

I've used it successfully with a couple of different projects.

The JSON serialization its expecting for objects is like this:

{ "className" : { "key1" : "value1", "key2" : { "className2" : { "key1" : "value1" }}}}

Arrays, I believe, are the same with multiple entries like the preceding surrounded by square brackets and comma separated.

Frank Schmitt
I checked out ObjectiveResource. It looks pretty sweet! There isn't any documentation about how it works, or what the data looks like when it's sent, and since I will be using PHP (Zend Framework) to create the REST server, I'm not really sure if this will work for me.
Andrew
I have used ObjectiveResource, and while the idea is great, the implementation is not that good. The biggest problem is the lack of asynchronous requests, which means that a priori every request will block the main thread, which is unacceptable IMHO. I would avoid it.
Adrian Kosmaczewski
akosma: It would be nice if there were an option to do an asynchronous call with a callback. I've only used it in situations where blocking is correct, or at least acceptable. I've used performSelector:withObject:afterDelay for the network call with some tiny delay to allow an activity indicator to start animating.
Frank Schmitt
Andrew: see edits.
Frank Schmitt
A: 

As I mentioned in the comments, I would go REST + JSON. However, in case you want to test another approach, I've posted some code in Github that provides a wrapper around the NSURL loading mechanism of Cocoa, which might be of help.

It was originally intended to load XML data formatted as Apple property lists (plists) which are the native serialization mechanism of Cocoa. There are Ruby and Python libraries available to generate XML in the plist format (I suppose some of them also generate binary plists, which are faster to parse and deserialize).

In line 154 you can see how the property list loaded into an NSData instance is transformed into a native NSDictionary.

http://github.com/akosma/iphonerestwrapper/blob/master/Classes/Wrapper.m#L154

Adrian Kosmaczewski