通过Curl或Android发布相同的有效负载时,Rails参数不同

时间:2017-03-04 17:26:44

标签: android ruby-on-rails json curl

从Android发布相同的基本JSON或通过curling发布时,结果会有所不同。

我试图理解为什么?我假设有一些关于Rails的东西,我不明白。

命令行HTTP POST

  

curl' http://localhost:3000/mobile/register' -X POST -H'内容类型:   应用/ JSON' -d' {" user":{" email":" awesome@example.com",   "密码":" helloworld"," password_confirmation":" helloworld"}}'

服务器日志

  

参数:{" user" => {" email" =>" awesome@example.com",   "密码" =>" [已过滤]"," password_confirmation" =>" [已过滤]"},   "登记" = GT; {"用户" = GT; {"电子邮件" = GT;" awesome@example.com" ;,   "密码" =>" [过滤]"," password_confirmation" =>" [过滤]"}}}

Android HTTP POST

OkHttpClient client = new OkHttpClient();
JSONObject userObject = new JSONObject();

userObject.put("email", mUserEmail);
userObject.put("password", mUserPassword);
userObject.put("password_confirmation", mUserPasswordConfirmation);

String userString = userObject.toString();

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("user", userString)
        .build();

Request request = new Request.Builder()
        .url(REGISTER_API_ENDPOINT_URL)
        .method("POST", RequestBody.create(null, new byte[0]))
        .post(requestBody)
        .build();

Call call = client.newCall(request);
call.enqueue(new Callback()...

服务器日志

  

参数:   {"用户" = GT;" {\"电子邮件\":\" awesome@example.com \" \"密码\":\"的HelloWorld \" \" password_confirmation \":\"的HelloWorld \"}"}

Rails路线:

devise_scope :user do 
    namespace :mobile do
      post '/register', to: 'registrations#create', as: :register
    end
end


差异:

  • 卷曲隐藏密码但Android不
  • curling添加了一个包含所有重复数据的额外嵌套JSON

我不确定导致这些差异的原因是什么?

更新

我在控制器操作中检查了request.env["CONTENT_TYPE"],我发现Content-Type存在差异。

卷曲 - > application/json

Android - > multipart/form-data; boundary=...

这会导致问题吗?

从Android方面改变是否容易?我在请求中添加了.header("Content-Type", "application/json"),但没有区别?

1 个答案:

答案 0 :(得分:1)

我认为Android HTTP POST缺少Content-Type: application/json标头,因为它会发送多部分表单数据。因此rails应用程序将其记录为纯字符串数据,而不是解析它,注册用户和过滤密码。

此外,在curl命令的情况下,解析的JSON用户对象用于注册用户。重复的日志条目可能在此用户注册期间完成。

要使两个请求等效,请尝试使用http://square.github.io/okhttp/中提供的POST TO A SERVER示例。