views:

276

answers:

1

My question is very similar to http://stackoverflow.com/questions/695971/java-http-post-to-create-new-product-in-a-ruby-on-rails-application

I have a form that I want to "post" to a form that looks like this

Offer:<br /> 
<input id="ride_togive" name="ride[togive]" size="30" type="text" /> 
</p> 
<p> 
Request for Offer:<br /> 
<input id="ride_totake" name="ride[totake]" size="30" type="text" /> 
</p>

My Java code looks like this

DefaultHttpClient client = new DefaultHttpClient();

      HttpPost post = new HttpPost("http://172.16.60.129:3000/rides");

  // Configure the form parameters
     List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("ride_totake", "Ride to Vail"));
        nvps.add(new BasicNameValuePair("ride_togive", "$20"));

        post.addHeader("Content-Type","application/json");

        try {
   post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

        HttpResponse response = null;
  try {
   response = client.execute(post);
  } catch (ClientProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
        HttpEntity entity = response.getEntity();
        System.out.println("form get: " + response.getStatusLine());
        if (entity != null) {
            try {
    entity.consumeContent();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
        }

Here is the output of the RoR console

Processing RidesController#create (for 172.16.60.1 at 2009-11-04 22:22:52) [POST]
Parameters: {"_json"=>"totake=Ride+to+Vail&togive=%2420"}
Ride Columns (0.6ms)   SHOW FIELDS FROM `rides`
SQL (0.1ms)   BEGIN
Ride Create (0.3ms)   INSERT INTO `rides` (`isoffer`, `togive`, `howlong`, `updated_at`,       `totake`, `created_at`) 
VALUES(NULL, NULL, 0, '2009-11-05 05:22:52', NULL, '2009-11-05    05:22:52')
SQL (0.0ms)   COMMIT
Redirected to http://172.16.60.129:3000/rides
Completed in 9ms (DB: 1) | 302 Found [http://172.16.60.129/rides]

I guess my real question is how should I be addressing the RoR variables in Java?

+1  A: 

Use the name instead of the id in your html input tags. In your example, they are "ride[togive]" and "ride[totake]".

Sample Java code that works on my RoR project. Use HttpClient 3.1

 PostMethod post = new PostMethod("http://localhost:3000/projects");
NameValuePair[] data = {
  new NameValuePair("project[name]", "from java"),
  new NameValuePair("project[life_cycle_id]", "5")
};
post.setRequestBody(data);
// execute method and handle any error responses.

new HttpClient().executeMethod(post);

From RoR Console:

Processing ProjectsController#create (for 127.0.0.1 at 2009-11-04 22:07:39) [POS
T]
  Parameters: {"project"=>{"name"=>"from java", "life_cycle_id"=>"5"}}
marklai
I tried this and when I did I get the same RoR terminal response that I posted in my post, with null togive and totake values. Its weird. Any other ideas?
Pat R
marklai
unforunately this answer looks like it uses the old 3.1 of HttpClient and if one wants to run this with 4.1 it is not possible. I tried downgrading to 3.1 but it caused a conflict with the AuthenticityToken, I recieved an ActionController::InvalidAuthenticityToken. I believe that the when the content type is set to json then it will take care of this error.
Pat R
Just to confirm, I did get this code working once I disabled the AuthenticityToken on the RoR side. If anyone knows how to get it working with the AuthenticityToken let me know.-Pat
Pat R