views:

30

answers:

2

Hi, i am trying to call my Rails app using Ruby code .

I m having 2 tables .

Blogposts (id,name,slug,desc) Comments (id,data,node_id,node_type)

I m trying to post a comment through my ruby code.

The Url for me is like http://localhost:3000/api/blogs/comment.xml?slug=blogtitle-0&comment=aaaaaaaaaaaaaaa

I dont know how to write Ruby post code for this.

The one is tried is

require 'net/http'
require 'uri'

url = URI.parse('http://localhost:3000/api/blogs/comment.xml?slug=blogtitle-0')
req = Net::HTTP::Post.new(url.path)
req.basic_auth 'aruna', 'aruna'
req.set_form_data({'comment[data]'=>'aaaaaaaaaaaaaaa'}, ';')
res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
case res
  when Net::HTTPSuccess, Net::HTTPRedirection
    puts res.body
  else
    res.error!
  end
end

Please help in fixing this

Edit: The same thing i am trying using Java using Jersey library file .

Here also i am not getting the result. The one i tried in Java is,

blogBean = objBlogWrapper.postComment(slug,comment);

public BlogBean postComment(String slug, String comment) {
    System.out.println(slug+""+comment);
    // Create a multivalued map to store the parameters to be send in the REST call
    MultivaluedMap<String, String> newBlogParam = new MultivaluedMapImpl();
    // newBlogParam.add("blogpost[slug]", slug);
    // newBlogParam.add("comment[data]", comment);
    newBlogParam.add("slug", slug);
    newBlogParam.add("comment", comment);

    BlogBean blogBean = null;
    try {    
        blogBean = webResource.path(ConfigurationUtil.POST_COMMENT).header(ConfigurationUtil.AUTHENTICATION_HEADER, authentication)
.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_XML_TYPE).post(BlogBean.class, newBlogParam);

    }catch (UniformInterfaceException uie) {
        if (uie.getResponse().getStatus() == 401) {
            System.out.println("Can not authenticate user "+ConfigurationUtil.userName +
                            ". Please check your username/password and try again." );
        } else {
            System.out.println("Error when trying to talk to app. " +
                            "HTTP status code "+uie.getResponse().getStatus()+"returned. Finishing.");

        }
        return null;
    } catch (ClientHandlerException che) {
        System.out.println("Error when trying to talk toapp. Network issues? " +
                        "Please check the following message and try again later: "+che.getMessage());
        return null;
    }
    return blogBean;
}

where my ConfigurationUtil.POST_COMMENT="api/blogs/comment.xml";

The above doesnt show me any error nor the comment is posted ..

Please give suggestions.

+1  A: 

With Faraday you just do

body_resp = Faraday.post 'http://localhost:3000/api/blogs/comment.xml', {:slug => 'blogtitle-0', :comment => 'aaaaaaaaaaaaaaa'}.body

Using some external gem can help because Net::Http class in Ruby is not the most simplest API.

shingara
+1  A: 

Here you go,

  host, phost = ['http://localhost:3000', 'http://proxyhost:2521' ]
  user, password = [ 'user_name' , 'password' ]

  url, p_url = [URI.parse(host), URI.parse(phost)]
  resp = nil

  http = Net::HTTP.new(url.host, url.port, p_url.host, p_url.port)

  req  = Net::HTTP::Post.new(url.path)
  req.basic_auth user, password
  req.set_content_type 'application/xml'

  req.body = 'your_request_body'
  resp = http.start{|h| h.request(req)}

You may not need a proxy host at all. But just in case if you want your request proxied through, you can use that. The resp object will have your response.

Bragboy