Search code examples
androidretrofit2

Response{protocol=http/1.1,code=400,message=Bad Request


I'm trying to build an app and want to integrate a login API. But the response seems to be unsuccessful.

My MainActivity.java

...
`    package com.example.hb.loginapi;

import com.example.hb.loginapi.Login;
import com.example.hb.loginapi.ApiUtils;
import com.example.hb.loginapi.ResObj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;


import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    String emailID;

    String password;

    Login login;

    EditText emailField;
    EditText passwordField;
    TextView loginBtn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        emailField=(EditText)findViewById(R.id.enterEmail);
        passwordField=(EditText)findViewById(R.id.enterPassword);

        emailField.setText("jk@grr.la");
        passwordField.setText("Jk@12345");

        passwordField.setTransformationMethod(new PasswordTransformationMethod());

        loginBtn=(TextView)findViewById(R.id.loginBtn);
        loginBtn.setOnClickListener(this);

        login=ApiUtils.getLoginClass();
    }

    @Override
    public void onClick(View view){
        if(view.getId()==R.id.loginBtn){
            emailID=emailField.getText().toString();
             password=passwordField.getText().toString();

             if(validateLogin(emailID,password)){
                 doLogin(emailID,password);
             }
//             else{
//                 Toast.makeText(getApplicationContext(),"Username or Password Incorrect",Toast.LENGTH_LONG).show();
//             }
        }
    }

    private boolean validateLogin(String email, String password){
        if(email==null || email.trim().length()==0){
            Toast.makeText(getApplicationContext(),"Email required",Toast.LENGTH_LONG).show();
            return false;
        }
    if(password==null || password.trim().length()==0){
        Toast.makeText(getApplicationContext(),"Password required",Toast.LENGTH_LONG).show();
        return false;
    }
    return true;
}

    private void doLogin(final String email, final String password){
         Call<ResObj> call=login.loginInfo(email,password);
         call.enqueue(new Callback<ResObj>() {
             @Override
             public void onResponse(Call<ResObj> call, Response<ResObj> response) {
                 if (response.isSuccessful()) {
                     ResObj resObj = response.body();
                     if (resObj.getMessage().equals("You have successfully logged in.")) {
                         Toast.makeText(getApplicationContext(), "Successful", Toast.LENGTH_LONG).show();
                         } else {
                         Toast.makeText(getApplicationContext(), "Please provide correct data.", Toast.LENGTH_LONG).show();
                     }
                 }
             }
             @Override
             public void onFailure(Call<ResObj> call, Throwable t) {
                 Log.d("failure",t.getMessage()+"");
                 Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_LONG).show();
             }
        });
    }
}`
...

Retrofit Login Interface. ... `package com.example.hb.loginapi;

import retrofit2.Call;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;

 interface Login {

   @PUT("user_login_v1/{email}/{password}")
   Call<ResObj> loginInfo(@Path("email") String email, @Path("password") String password);

}`
...

ResObj.java ... `package com.example.hb.loginapi;

public class ResObj {
    private String message;

    public String getMessage(){
        return message;
    }
    public void setMessage(String message){
        this.message=message;
    }
}
`
...

RetrofitClient.java ... `package com.example.hb.loginapi;

import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    private static Retrofit retrofit = null;





    public static Retrofit getClient(String url){


        if(retrofit == null){
            retrofit = new Retrofit.Builder()
                    .baseUrl(url)
                    .addConverterFactory(GsonConverterFactory.create())
//                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
        }
        return retrofit;
    }
}
`
...

APIUtils.java ... `package com.example.hb.loginapi;

public class ApiUtils {
    public static final String BASE_URL="http://locateaplate.projectspreview.net/WS/";

    public static Login getLoginClass(){
        return RetrofitClient.getClient(BASE_URL).create(Login.class);
    }
}`
..

My Response JSON

  {
"settings": {
    "success": "1",
    "message": "You have successfully logged in.",
    "fields": [
        "user_id",
        "email",
        "status",
        "profile_image",
        "access_token",
        "phone",
        "user_name",
        "plate_number",
        "state_id",
        "state",
        "is_social",
        "is_notification_enabled",
        "search_report_count"
    ]
},
"data": [
    {
        "user_id": "108",
        "email": "jk@grr.la",
        "status": "Active",
        "profile_image": "http://locateaplate.projectspreview.net/public/upload/profile_images/978307200_0-20190515152207782279.png",
        "access_token": "a4e7fc783f5b56af1eb3d3e762c05468b5a1ef71c38d2a8508ef32678a99b3d0",
        "phone": "",
        "user_name": "Jack Kalsan",
        "plate_number": "ABC1234",
        "state_id": "2722",
        "state": "Abakan",
        "is_social": "",
        "is_notification_enabled": "Yes",
        "search_report_count": "69"
    }
]

}


Solution

  • Your interface should be

    interface Login {
    
       @GET("user_login_v1")
       Call<ResObj> loginInfo(@Query("email") String email, @Query("password") String password);
    
    }
    

    Response Model is

    import com.google.gson.annotations.SerializedName;
    
    import java.util.List;
    
    public class ResObj{
    
        @SerializedName("settings")
        private Settings settings;
    
        @SerializedName("data")
        private List<DataItem> data;
    
        public void setSettings(Settings settings){
            this.settings = settings;
        }
    
        public Settings getSettings(){
            return settings;
        }
    
        public void setData(List<DataItem> data){
            this.data = data;
        }
    
        public List<DataItem> getData(){
            return data;
        }
    
        public class Settings {
    
            @SerializedName("success")
            private String success;
    
            @SerializedName("message")
            private String message;
    
            @SerializedName("fields")
            private List<String> fields;
    
            public void setSuccess(String success) {
                this.success = success;
            }
    
            public String getSuccess() {
                return success;
            }
    
            public void setMessage(String message) {
                this.message = message;
            }
    
            public String getMessage() {
                return message;
            }
    
            public void setFields(List<String> fields) {
                this.fields = fields;
            }
    
            public List<String> getFields() {
                return fields;
            }
        }
    
        public class DataItem{
    
            @SerializedName("user_name")
            private String userName;
    
            @SerializedName("search_report_count")
            private String searchReportCount;
    
            @SerializedName("access_token")
            private String accessToken;
    
            @SerializedName("profile_image")
            private String profileImage;
    
            @SerializedName("is_social")
            private String isSocial;
    
            @SerializedName("is_notification_enabled")
            private String isNotificationEnabled;
    
            @SerializedName("user_id")
            private String userId;
    
            @SerializedName("phone")
            private String phone;
    
            @SerializedName("plate_number")
            private String plateNumber;
    
            @SerializedName("state_id")
            private String stateId;
    
            @SerializedName("state")
            private String state;
    
            @SerializedName("email")
            private String email;
    
            @SerializedName("status")
            private String status;
    
            public void setUserName(String userName){
                this.userName = userName;
            }
    
            public String getUserName(){
                return userName;
            }
    
            public void setSearchReportCount(String searchReportCount){
                this.searchReportCount = searchReportCount;
            }
    
            public String getSearchReportCount(){
                return searchReportCount;
            }
    
            public void setAccessToken(String accessToken){
                this.accessToken = accessToken;
            }
    
            public String getAccessToken(){
                return accessToken;
            }
    
            public void setProfileImage(String profileImage){
                this.profileImage = profileImage;
            }
    
            public String getProfileImage(){
                return profileImage;
            }
    
            public void setIsSocial(String isSocial){
                this.isSocial = isSocial;
            }
    
            public String getIsSocial(){
                return isSocial;
            }
    
            public void setIsNotificationEnabled(String isNotificationEnabled){
                this.isNotificationEnabled = isNotificationEnabled;
            }
    
            public String getIsNotificationEnabled(){
                return isNotificationEnabled;
            }
    
            public void setUserId(String userId){
                this.userId = userId;
            }
    
            public String getUserId(){
                return userId;
            }
    
            public void setPhone(String phone){
                this.phone = phone;
            }
    
            public String getPhone(){
                return phone;
            }
    
            public void setPlateNumber(String plateNumber){
                this.plateNumber = plateNumber;
            }
    
            public String getPlateNumber(){
                return plateNumber;
            }
    
            public void setStateId(String stateId){
                this.stateId = stateId;
            }
    
            public String getStateId(){
                return stateId;
            }
    
            public void setState(String state){
                this.state = state;
            }
    
            public String getState(){
                return state;
            }
    
            public void setEmail(String email){
                this.email = email;
            }
    
            public String getEmail(){
                return email;
            }
    
            public void setStatus(String status){
                this.status = status;
            }
    
            public String getStatus(){
                return status;
            }
        }
    }
    

    Retrieve message :

     ResObj resObj = response.body();
     String message=resObj.getSetting().getMessage();