POST与Android改造

我是Android编程新手,并正在使用Retrofit。 我已经做了一些关于这个话题的研究,但一直没有find一个特定于我的需求的解决scheme。 我正在使用我们的API并试图发出POST请求。 我用下面的非改进代码成功实现了这一点:

private class ProcessLogin extends AsyncTask<Void, String, JSONObject> { private ProgressDialog pDialog; String email,password; protected void onPreExecute() { super.onPreExecute(); inputEmail = (EditText) findViewById(R.id.email); inputPassword = (EditText) findViewById(R.id.password); email = inputEmail.getText().toString(); password = inputPassword.getText().toString(); pDialog = new ProgressDialog(LoginActivity.this); pDialog.setTitle("Contacting Servers"); pDialog.setMessage("Logging in ..."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } protected JSONObject doInBackground(Void... params) { HttpURLConnection connection; OutputStreamWriter request = null; URL url = null; String response = null; String parameters = "username="+email+"&password="+password; try { url = new URL("http://.../api/login"); connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestMethod("POST"); request = new OutputStreamWriter(connection.getOutputStream()); request.write(parameters); request.flush(); request.close(); String line = ""; InputStreamReader isr = new InputStreamReader(connection.getInputStream()); BufferedReader reader = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } // Response from server after login process will be stored in response variable. response = sb.toString(); // You can perform UI operations here isr.close(); reader.close(); } catch(IOException e) { // Error } System.out.println(response); JSONObject jObj = null; // Try to parse the string to a JSON Object try { jObj = new JSONObject(response); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } // Return the JSONObject return jObj; } protected void onPostExecute(JSONObject json) { String status = (String) json.optJSONArray("users").optJSONObject(0).optJSONObject("user").optString("login"); pDialog.dismiss(); if (status.equals("Failed")) { loginMessage.setText("Login Failed"); } else if (status.equals("Success")) { loginMessage.setText("Success!"); startActivity(new Intent(getApplicationContext(), DActivity.class)); } } } 

现在,我试图使用Retrofit得到相同的结果,但我不知道如何从我们的API使用callback获取JSON(我假设这个调用应该asynchronous发生?):

我用下面的方法做了一个接口:

  @FormUrlEncoded @POST("/login") public void login(@Field("username") String username, @Field("password") String password, Callback<JSONObject> callback); 

并在我的Activity的onCreate方法中实例化RestAdapter等。 当用户按下“login”button(在input他们的用户名和密码后),button的onClick方法内部调用以下内容:

  service.login(email, password, new Callback<JSONObject>() { @Override public void failure(final RetrofitError error) { android.util.Log.i("example", "Error, body: " + error.getBody().toString()); } @Override public void success(JSONObject arg0, Response arg1) { } } ); 

然而,这并不是按预期工作,我真的不认为我正确地接近这一点。 我希望能够发送POST到我们的服务器,该服务器发送一个关于该用户的JSON格式的数据块。 如果任何人都可以指出我的方向,那将是非常感激的。 先谢谢你

Solutions Collecting From Web of "POST与Android改造"

Retrofit的好处之一是不必自己parsingJSON。 你应该有这样的东西:

 service.login(email, password, new Callback<User>() { @Override public void failure(final RetrofitError error) { android.util.Log.i("example", "Error, body: " + error.getBody().toString()); } @Override public void success(User user, Response response) { // Do something with the User object returned } } ); 

User是什么POJO喜欢

 public class User { private String name; private String email; // ... etc. } 

并且返回的JSON具有与User类匹配的字段:

 { "name": "Bob User", "email": "bob@example.com", ... } 

如果您需要自定义分析,则使用.setConverter(转换器转换器)设置REST适配器的转换器的位置 :

该转换器用于对象的序列化和反序列化。

似乎改造与@POST@FormUrlEncoded有问题。 如果我们做同步,它工作得很好,但如果是asynchronous的,则失败

如果@mike问题是反序列化对象,那么User类应该是

 public class User { @SerializedName("name") String name; @SerializedName("email") String email; } 

接口类

 @FormUrlEncoded @POST("/login") void login(@Field("username") String username, @Field("password") String password, Callback<User> callback); 

要么

 @FormUrlEncoded @POST("/login") void login(@Field("username") String username, @Field("password") String password, Callback<UserResponse> callback); 

哪里

 public class UserResponse { @SerializedName("email") String email; @SerializedName("name") String name; }