On Mon, Jan 9, 2012 at 1:10 PM, Jonny Turk <[email protected]>wrote:
> I am new to rails and looking someone to point me in the right > direction in how to accomplish the following:- > > I need to communicate with an external api by either passing an XML > document directly > into the cgi (https://api.domain.com/v1/method.cgi) and set the > content-type to "text/xml", or pass it as a parameter and set the > content-type to "text/plain" > > I supposedly get an XML response back instead of the HTML response, so > no need to download the HTML response, store it, then render a local > copy for the user; nor will i need to stick the XML document within a > parameter of a locally generated HTML form to submit it via the > browser to avoid downloading the HTML. > > Each API method has example xml code for (Sending, The Response, DTD, > Schema) > > What is the best tools/techniques to accomplish this !?? > > One of their simpler methods is as follows :- > > **SEND** > > <?xml version="1.0" encoding="utf-8" ?> > <SoftwareAPI> > <Method>ListUsers</Method> > <APIKey>123</APIKey> > <Account> > <UserName>admin</UserName> > <Password>Password</Password> > </Account> > </SoftwareAPI> > > **RESPONSE** > > <?xml version="1.0" encoding="utf-8" ?> > <SoftwareAPIResponse> > <TimeNow>2012-01-23T16:44:00Z</TimeNow> > <ResponseId>01-23-1232729040-23456</ResponseId> > <ListUsersResponse> > <User> > <Team>team</Team> > <Office>office</Office> > <UserName>Joe.Bloggs</UserName> > <Password>Password123</Password> > <FullName>Joe Bloggs</FullName> > <Language>Auto-Detect</Language> > <Telephone>+44 207 123 456 789</Telephone> > <ResponseEmail>[email protected]</ResponseEmail> > </User> > </ListUsersResponse> > </SoftwareAPIResponse> > > This API method needs no interaction from the user or view, should the > coding be done from the controller or should I create a model for all > the api methods ? > > How do I perform a post to the cgi url with the specified XML above > and process the response XML and display in a view ? > > What are the best practices for accomplishing this ? > A few hints ... 1) Add a XML file to override the JSON default template wit scaffolds. Something like this: https://gist.github.com/1583881 (this is just the default JSON format, with all json find/replace with xml). 2) Try out $ rails generate resource User first_name:string last_name:string to see an example in a scaffold. Once that is there, you can start playing with localhost:3000/users.xml to see the effect. By targeting either: * the .xml extension in a GUI browser * the Accept and Content-Type 'application/xml' in curl (see below) Check the /log/development.log to verify that XML format is used (and not HTML) 3) You may override to_xml to e.g. have whitelists on what you expose over the API (don't forget to call super in your overridden method). to_xml will be default be used and will render a default XML template. You can override that with a custom xml builder, like: app/views/users/index.html.haml app/views/users/index.xml.builder app/views/users/show.xml.builder # here you would create your special builder for # <SoftwareAPIResponse> if needed But with clever includes and whitelists of associated resources, you may be able to use the default XML template. 4) When you have associated models (e.g. User has_one :address), you will face 2 difficulties: * address.singularize is wrong and this causes a bug in the to_xml serializer (<user><addres>...</addres></user> with 1 's'). I will try to commit a patch for that (in the meanwhile, use custom inflections where needed). * for create/update accepts_nested_attributes_for will not work straightforwardly (since it only adds e.g. user.address_attributes= ; but for XML you would need user.address= to accept a hash and not a <Address ...> object. I will try to publish a gem for that. * for the XML format (instead of HTML), the client needs to set BOTH the Accepts and the Content-Type headers. You could use curl to test. Like this: ... request << "--header 'Accept:application/xml'" request << "--header 'Content-Type:application/xml; charset=utf-8'" HTH. Call me if you have more questions on this. Peter -- Peter Vandenabeele http://twitter.com/peter_v http://rails.vandenabeele.com -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

