2009-03-30 3 views
4

Utilisation de l'Apache HttpClient sur Android, comment puis-je envoyer des données à un Ruby sur l'application Rails REST à l'aide HttpPost.Java: HTTP Post pour créer de nouveaux "produits" dans un Ruby on Rails application

Ceci est mon contrôleur:

# POST /products 
    def create 

    @product = Product.new(params[:product]) 

    respond_to do |format| 
     if @product.save 
     flash[:notice] = 'Product was successfully created.' 
     format.html { redirect_to(@product) } 
     format.xml { render :xml => @product, :status => :created, :location => @product } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @product.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

Et ceci est mon code Java. Dois-je transmettre les données dans le nom de l'URL ou dois-je le définir ailleurs? (httpost.setEntity peut-être?) Finalement j'utiliserai JSON mais pour l'instant je veux juste l'obtenir afin que je puisse réellement appeler la méthode "create" dans Rails. Rails devient le POST, mais jamais exécute un code dans la « créer » méthode

HttpClient httpclient = new DefaultHttpClient(); 

    HttpPost httppost = new HttpPost("http://192.168.0.100:3000/products/new"); 

    HttpResponse response = httpclient.execute(httppost); 

Je suis tout à fait coincé et vous serais reconnaissant si quelqu'un pourrait me diriger dans la bonne direction.

Répondre

3

J'ai ajouté ce qui suit à ma requête POST et cela a fonctionné comme un charme.

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

Rails n'exécute aucun code dans la méthode Create car vous effectuez une requête auprès de la méthode "New".

Typiquement, la méthode New est utilisée pour rendre un formulaire HTML que l'utilisateur soumet ensuite à la méthode create. Pour un service Web, cette méthode n'est pas nécessaire.

Utilisez plutôt l'URL http://192.168.0.100:3000/products (sans/new). Par défaut, les rails achemineront cette requête à la méthode Create en examinant le type de requête et en voyant qu'il s'agit d'une requête POST. Ceci suppose que vous avez correctement configuré les produits pour qu'ils soient une ressource RESTful sur vos routes. Sinon, vous devrez utiliser http://192.168.0.100:3000/products/create. Voici le document d'API pour les ressources et routes RESTful: http://api.rubyonrails.org/classes/ActionController/Resources.html

+0

J'ai essayé avec juste/produits et j'obtiens le même résultat. Le journal WEBrick montre qu'il obtient un POST mais il n'imprime pas et ne "met" pas les déclarations que j'ai mises dans la méthode create – brodie31k

+0

J'ai édité ma réponse pour avoir plus d'informations. Essayez/products/create. Si cela fonctionne, vous devrez probablement modifier vos itinéraires pour traiter les produits comme une ressource reposante. Si ça ne marche pas, il y a un autre problème. – Gdeglin

0

Pour soumettre des données dans une demande POST, vous devez appeler le httppost.setRequestBody(). Cette méthode prend un tableau de NameValuePair s avec vos données - consultez la documentation du client HTTP pour la syntaxe correcte.

+0

Merci, j'avais l'impression que c'était quelque chose de simple mais je continuais à descendre des chemins qui ne fonctionnaient pas et j'étais frustré! – brodie31k