从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
差异:
我不确定导致这些差异的原因是什么?
我在控制器操作中检查了request.env["CONTENT_TYPE"]
,我发现Content-Type
存在差异。
卷曲 - > application/json
Android - > multipart/form-data; boundary=...
这会导致问题吗?
从Android方面改变是否容易?我在请求中添加了.header("Content-Type", "application/json")
,但没有区别?
答案 0 :(得分:1)
我认为Android HTTP POST缺少Content-Type: application/json
标头,因为它会发送多部分表单数据。因此rails应用程序将其记录为纯字符串数据,而不是解析它,注册用户和过滤密码。
此外,在curl
命令的情况下,解析的JSON用户对象用于注册用户。重复的日志条目可能在此用户注册期间完成。
要使两个请求等效,请尝试使用http://square.github.io/okhttp/中提供的POST TO A SERVER
示例。