レトロフィット2.0の非常に残念な特徴は、それが応答の解析に失敗したところ、それは正確に教えてくれないということです。したがって、私は同じ身体で要求を打つ郵便配達で、私は、ログイン応答としての取得します:
{
"result": "success",
"response_code": 200,
"data": {
"id": "1",
"display_name": "admin",
"email": "[email protected]",
"username": "admin",
"access_token": "8daa8e02ca432e51ae90912fbf63eeea"
}
}
私はレトロフィットでまったく同じボディとまったく同じ要求を打ったときしかし、私は非常に特異な応答を得るなど:{プロトコル= HTTP / 1.1、コード= 200、メッセージ= OK、URL = http://192.168.0.52/evidya / WP-API / V1 /ユーザ/ログイン }。今私は、上記の問題とその他の関連する質問を経てきたが、それらのどれも私のために働いていません。助けてください。私のコード:
レトロフィットAPIインタフェース:
public interface eVidyaApi {
@FormUrlEncoded
@POST("user/login")
Call<LoginResponse> loginUser(
@HeaderMap Map<String, String> headers,
@Field("email") String email,
@Field("password") String password
);
}
ログイン機能:
public void login() {
Log.d(TAG, "Login");
if (!validate()) {
onLoginFailed();
return;
}
final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this, R.style.MyDialogTheme);
progressDialog.setIndeterminate(true);
progressDialog.setMessage("Authenticating...");
progressDialog.show();
String email = _emailText.getText().toString();
String password = _passwordText.getText().toString();
Log.d(TAG, "login: "+email+" "+password);
// TODO: Implement your own authentication logic here.
Call<LoginResponse> loginResponseCall = evidya.loginUser(Common.getHeaders(), email, password);
loginResponseCall.enqueue(new Callback<LoginResponse>() {
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
progressDialog.dismiss();
if(!response.isSuccessful()){
Toast.makeText(LoginActivity.this, ""+response.message(), Toast.LENGTH_SHORT).show();
Log.d(TAG, "onResponse: fail "+response.code());
return;
}
Log.d(TAG, "onResponse: success"+response.code()+" "+response);
if(response.body()!=null){
String content="";
// _loginButton.setEnabled(false);
LoginResponse loginResponse = response.body();
content += "code:"+ response.code();
content += "token:"+ loginResponse.getData().getAccessToken();
content += "result"+ loginResponse.getResult();
content += "result"+ loginResponse.getData().getDisplayName();
// onLoginSuccess();
Log.d(TAG, "onResponse: login res"+content);
} else {
Toast.makeText(LoginActivity.this, "Invalid response from server", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
progressDialog.dismiss();
Toast.makeText(LoginActivity.this, "Cannot fetch request", Toast.LENGTH_SHORT).show();
}
});
}
LoginResponse.java
package com.example.evidya.Retrofit.Model.LoginModel;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class LoginResponse {
@SerializedName("result")
@Expose
private String result;
@SerializedName("response_code")
@Expose
private Integer responseCode;
@SerializedName("data")
@Expose
private Data data;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public Integer getResponseCode() {
return responseCode;
}
public void setResponseCode(Integer responseCode) {
this.responseCode = responseCode;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
}
Data.java
package com.example.evidya.Retrofit.Model.LoginModel;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Data {
@SerializedName("id")
@Expose
private String id;
@SerializedName("display_name")
@Expose
private String displayName;
@SerializedName("email")
@Expose
private String email;
@SerializedName("username")
@Expose
private String username;
@SerializedName("access_token")
@Expose
private String accessToken;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
}
私のログ(OK hhttp)、間違った内容で、ログインボタンをクリックすると:
私のログ(OK hhttp)、正しい内容で、ログインボタンをクリックすると:
基本的な問題は、私が使っていたということでしたLog.d(TAG, "onResponse: success"+response.code()+" "+response);
onresponseコールバックでの応答を確認すること。私が行っている必要があり、すべてがそこに引っかかってloginResponseオブジェクト(からの値をチェックしないことであるのに対しLoginResponse loginResponse = response.body();
)。response.bodyは、実際にはオブジェクト形式でREPONSEを格納しているため。物事が改修中でどのように動作するかです。
あなたのログにつきとして、APIが正常に呼び出されます。また、応答します。しかし、問題は、あなたのバックエンドからAPI認証失敗しています。Webサービスやチェックのログを追加します。アプリケーション側からは、それが正常に動作しています。これはレトロフィットの問題ではありません。
以下、実行アプリケーションを使用してonResponse()を更新します。その後、私は何を得るのメッセージを知ってテストしてみましょう。
if(response.body()!=null){
LoginResponse loginResponse = response.body();
String content="";
if (response.body().getResponseCode()==200){
content+= loginResponse.getData().getAccessToken();
content+= loginResponse.getData().getDisplayName();
content+= loginResponse.getData().getEmail();
content+= loginResponse.getData().getId();
content+= loginResponse.getData().getUsername();
}else{
content+=loginResponse.getData().getMsg();
}
Log.d(TAG, "onResponse: login res"+content);
} else {
Toast.makeText(LoginActivity.this, "Invalid response from server", Toast.LENGTH_SHORT).show();
}
Data.javaのコードの下に
@SerializedName("msg")
@Expose
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}