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

当通过Curl或Android发布相同的负载时,Rails参数是不同的,android,ruby-on-rails,json,curl,Android,Ruby On Rails,Json,Curl,当从Android或通过curling发布相同的基本JSON时,结果是不同的 我想知道为什么?我假设Rails有一些我不理解的地方 命令行HTTP POST OkHttpClient client = new OkHttpClient(); JSONObject userObject = new JSONObject(); userObject.put("email", mUserEmail); userObject.put("password", mUserPassword); userOb

当从Android或通过curling发布相同的基本JSON时,结果是不同的

我想知道为什么?我假设Rails有一些我不理解的地方

命令行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()...
卷曲'-X POST-H'内容类型: application/json'-d'{“user”:{“email”:”awesome@example.com", “密码”:“helloworld”,“密码确认”:“helloworld”}”

服务器日志

参数:{“用户”=>{“电子邮件”=>“awesome@example.com", “密码”=>“[过滤]”,“密码确认”=>“[过滤]”}, “注册”=>{“用户”=>{“电子邮件”=>”awesome@example.com", “密码”=>“[过滤]”,“密码确认”=>“[过滤]”}

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()...
服务器日志

参数: {“用户”=>“{\“电子邮件\”:”awesome@example.com\“,”密码\“:\”helloworld \“,”密码确认\“:\”helloworld \“}”

铁路线路:

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

差异:

devise_scope :user do 
    namespace :mobile do
      post '/register', to: 'registrations#create', as: :register
    end
end
  • 卷发隐藏了密码,但Android没有
  • curling添加了一个额外的嵌套JSON,所有数据都重复
我不确定是什么导致了这些差异?

更新 我在控制器操作中选中了
request.env[“CONTENT\u TYPE”]
,我发现
内容类型存在差异

Curl->
application/json

Android->
多部分/表单数据;边界=…

这会导致问题吗


从安卓方面进行更改容易吗?我在请求中添加了
.header(“Content-Type”,“application/json”)
,但没有什么区别?

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

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


要使这两个请求等效,请尝试使用中给出的
发送到服务器的示例。

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

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

要使两个请求等效,请尝试使用中给出的
发送到服务器的示例