2012-01-29 108 views
3

我正嘗試使用post請求(JSON)來創建用戶。捲曲的例子很好。這裏是curl命令:Rails/Devise - Unprocessable Entity

curl -X POST -H "Content-Type: application/json" 'http://localhost:3000/users.json' -d '{ "user": {"email": "[email protected]", "password": "foobar", "password_confirmation": "foobar"}}' 

捲曲輸出:

Started POST "/users.json" for 127.0.0.1 at 2012-01-28 16:19:10 -0800 
    Processing by Devise::RegistrationsController#create as JSON 
    Parameters: {"user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}} 

但是當我嘗試在Java HTTP庫的請求我得到一個錯誤:

Started POST "/users.json" for 192.168.1.88 at 2012-01-28 16:47:56 -0800 
    Processing by Devise::RegistrationsController#create as JSON 
    Parameters: {"user"=>"{\"password_confirmation\":\"secret\",\"password\":\"secret\",\"email\":\"[email protected]\"}"} 
Completed 422 Unprocessable Entity in 73ms (Views: 3.0ms | ActiveRecord: 0.0ms) 

代碼用於創建請求:

  RestClient client = new RestClient(SIGNUP_URL); 
      JSONObject jObj = new JSONObject(); 
      JSONObject jsonUserObj = new JSONObject(); 

      try { 
       jObj.put("email", txtUserName.getText().toString()); 
       jObj.put("password", txtPassword.getText().toString()); 
       jObj.put("password_confirmation", txtPassword.getText().toString()); 

       jsonUserObj.put("user", jObj.toString()); 
      } catch (JSONException e1) { 
       e1.printStackTrace(); 
      } 

      client.setJSONParams(jsonUserObj); 
      try { 
       client.Execute(RequestMethod.JSON_POST); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
        e.printStackTrace(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
      if (client.getResponseCode() == HttpStatus.SC_OK) { 
       // Good response 
       try { 
        jObj = new JSONObject(client.getResponse()); 
        System.out.println("Signup Successful"); 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

這裏是要求執行功能:

HttpPost request = new HttpPost(url); 
      request.addHeader("Content-Type", "application/json"); 
      request.addHeader("Accept", "application/json"); 
      StringEntity s = new StringEntity(jsonParams.toString(), HTTP.UTF_8); 
      s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
      request.setEntity(s); 
      executeRequest(request, url); 
      break; 
+0

我很確定問題在於字符串被轉義。 – manmal 2012-02-14 19:19:06

回答

0

如果你看一下日誌,從你看到用戶的內容只是一個大逃串,而不是Java庫的要求嵌套散列。

當你在看你的代碼創建一個請求你:

jsonUserObj.put("user", jObj.toString()); 

我猜,如果你把它改成:

jsonUserObj.put("user", jObj); 

它的工作,因爲那會將作爲jObj的散列與「用戶」相關聯,而不是將該對象的字符串與「用戶」相關聯

0

對於我來說,同樣的問題來自於中的一些錯誤3210所以我會與你分享我的,你可以做出必要的修改以適應你的需求

class RegistrationsController < Devise::RegistrationsController 
    skip_before_filter :verify_authenticity_token, 
        :if => Proc.new { |c| c.request.format == 'application/json' } 

    respond_to :json 

    def create 
    build_resource 
    resource = User.new(params[:user]) 
    if resource.save 
     sign_in resource 
     render :status => 200, 
      :json => { :success => true, 
         :info => "Registered", 
         :data => { :user => resource, 
           :auth_token => current_user.authentication_token } } 
    else 
     logger.info("current user passed from json: #{resource.to_yaml}") 
     render :status => :unprocessable_entity, 
      :json => { :success => false, 
         :info => resource.errors, 
         :data => {} } 
    end 
    end 
end