通过Curl或Android发布相同的有效内容时,Rails参数会有所不同
从Android或通过卷曲发布相同的基本JSON时,结果会有所不同。
我试图理解为什么? 我假设有一些关于Rails的东西,我不明白。
命令行HTTP POST
curl'http:// localhost:3000 / mobile / register'-X POST -H'Content-Type:application / json'-d'{“user”:{“email”:“awesome@example.com”,“密码“:”helloworld“,”password_confirmation“:”helloworld“}}'
服务器日志
参数:{“user”=> {“email”=>“awesome@example.com”,“password”=>“[FILTERED]”,“password_confirmation”=>“[FILTERED]”},“registration”=> {“user”=> {“email”=>“awesome@example.com”,“password”=>“[FILTERED]”,“password_confirmation”=>“[FILTERED]”}}}
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()...
服务器日志
参数:{“user”=>“{”email “:”awesome@example.com “,”password “:”helloworld “,”password_confirmation “:”helloworld “} “}
Rails路线:
devise_scope :user do
namespace :mobile do
post '/register', to: 'registrations#create', as: :register
end
end
区别:
我不确定是什么导致了这些差异?
UPDATE
我在控制器操作中检查了request.env["CONTENT_TYPE"]
,并发现Content-Type
差异。
卷曲 - > application/json
Android - > multipart/form-data; boundary=...
multipart/form-data; boundary=...
这是否会导致问题?
从Android侧更换容易吗? 我向.header("Content-Type", "application/json")
添加了.header("Content-Type", "application/json")
,但它没有区别?
我认为Android HTTP POST缺少Content-Type: application/json
头,因为它发送多部分表单数据。 因此,rails应用程序将它记录为纯字符串数据而不是解析它,注册用户和过滤密码。
此外,在curl
命令的情况下,解析的JSON用户对象用于注册用户。 重复的日志条目可能在此用户注册期间完成。
要使这两个请求等效,请尝试使用http://square.github.io/okhttp/中提供的POST TO A SERVER
示例。
上一篇: Rails parameters are different when posting the same payload via Curl or Android