On Mon, Jan 9, 2012 at 1:10 PM, Jonny Turk
<turkingtonj-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>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>joebloggs-9IKiO1iGCm/QXOPxS62xeg@public.gmane.org</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
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.