Restful_authentication as a web service?

Hey everyone,

  I have been using Ruby on Rails for a few months now (I come from a php / Java/J2EE background) and have been LOVING it. I do have one question regarding XML output and the SessionsController#create method that is generated by the restful authentication plugin.

  I added the following code to the create method:

      #if login is successful

      respond_to do |format|         format.html { redirect_back_or_default('/')}# index.html.erb         format.xml { render :xml => self.current_user }       end

    #if login is not successful

      respond_to do |format|         format.html { render :action => 'new'}# index.html.erb         format.xml { response.status_code.should == 401 }       end

    When I try to test this like this: http://localhost:3000/sessions/create?login=myuser&password=mypassword I am able to login successfully. If I add .xml to the end of create like this: http://localhost:3000/sessions/create.xml?login=myuser&password=mypassword I get the following exception: No route matches "/sessions/create.xml" with {:method=>:get}. My routes.rb is pretty generic (has all of the restful authentication mappings) and I haven't touched it. Any ideas as to what I'm doing wrong? How can I log in to my site from a 3rd party client?

Thanks, Mark Dinstuhl

The format is determined by the HTTP Accept header, and not by adding an extension on the URL. So, your url remains /sessions/create and not /sessions/create.xml

You can test this out by using a command line tool like curl. For example:

curl -H "Accept: application/xml" "http://localhost:3000/sessions/ create?login=xxx&password=xxx"

This should return your xml.

You can use the RestfulClient gem to test it out instead of CURL.

hitch wrote:

The format is determined by the HTTP Accept header, and not by adding an extension on the URL. So, your url remains /sessions/create and not /sessions/create.xml

Wait a moment. The URI is actually /sessions not /sessions/create. The HTTP verb is used to select the create method: POST http://localhost:3000/sessions would route the request to the create method in the controller.

Larry,

  Thank you SO much for answering my question. If anyone is wondering, THIS WORKED.

Have a good one! Martin Dinstuhl