Send Post Request with params using Retrofit
build.gradle
compile 'com.google.code.gson:gson:2.6.2' compile 'com.squareup.retrofit2:retrofit:2.1.0'// compulsory compile 'com.squareup.retrofit2:converter-gson:2.1.0' //for retrofit conversion
Login APi Put Two Parameters
{ "UserId": "1234", "Password":"1234" }
Login Response
{ "UserId": "1234", "FirstName": "Keshav", "LastName": "Gera", "ProfilePicture": "312.113.221.1/GEOMVCAPI/Files/1.500534651736E12p.jpg" }
APIClient.java
import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; class APIClient { public static final String BASE_URL = "Your Base Url "; private static Retrofit retrofit = null; public static Retrofit getClient() { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } }
APIInterface interface
interface APIInterface { @POST("LoginController/Login") Call<LoginResponse> createUser(@Body LoginResponse login); }
Login Pojo
package pojos; import com.google.gson.annotations.SerializedName; public class LoginResponse { @SerializedName("UserId") public String UserId; @SerializedName("FirstName") public String FirstName; @SerializedName("LastName") public String LastName; @SerializedName("ProfilePicture") public String ProfilePicture; @SerializedName("Password") public String Password; @SerializedName("ResponseCode") public String ResponseCode; @SerializedName("ResponseMessage") public String ResponseMessage; public LoginResponse(String UserId, String Password) { this.UserId = UserId; this.Password = Password; } public String getUserId() { return UserId; } public String getFirstName() { return FirstName; } public String getLastName() { return LastName; } public String getProfilePicture() { return ProfilePicture; } public String getResponseCode() { return ResponseCode; } public String getResponseMessage() { return ResponseMessage; } }
MainActivity
package com.keshav.retrofitloginexampleworkingkeshav; import android.app.Dialog; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import pojos.LoginResponse; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import utilites.CommonMethod; public class MainActivity extends AppCompatActivity { TextView responseText; APIInterface apiInterface; Button loginSub; EditText et_Email; EditText et_Pass; private Dialog mDialog; String userId; String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); apiInterface = APIClient.getClient().create(APIInterface.class); loginSub = (Button) findViewById(R.id.loginSub); et_Email = (EditText) findViewById(R.id.edtEmail); et_Pass = (EditText) findViewById(R.id.edtPass); loginSub.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (checkValidation()) { if (CommonMethod.isNetworkAvailable(MainActivity.this)) loginRetrofit2Api(userId, password); else CommonMethod.showAlert("Internet Connectivity Failure", MainActivity.this); } } }); } private void loginRetrofit2Api(String userId, String password) { final LoginResponse login = new LoginResponse(userId, password); Call<LoginResponse> call1 = apiInterface.createUser(login); call1.enqueue(new Callback<LoginResponse>() { @Override public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { LoginResponse loginResponse = response.body(); Log.e("keshav", "loginResponse 1 --> " + loginResponse); if (loginResponse != null) { Log.e("keshav", "getUserId --> " + loginResponse.getUserId()); Log.e("keshav", "getFirstName --> " + loginResponse.getFirstName()); Log.e("keshav", "getLastName --> " + loginResponse.getLastName()); Log.e("keshav", "getProfilePicture --> " + loginResponse.getProfilePicture()); String responseCode = loginResponse.getResponseCode(); Log.e("keshav", "getResponseCode --> " + loginResponse.getResponseCode()); Log.e("keshav", "getResponseMessage --> " + loginResponse.getResponseMessage()); if (responseCode != null && responseCode.equals("404")) { Toast.makeText(MainActivity.this, "Invalid Login Details \n Please try again", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Welcome " + loginResponse.getFirstName(), Toast.LENGTH_SHORT).show(); } } } @Override public void onFailure(Call<LoginResponse> call, Throwable t) { Toast.makeText(getApplicationContext(), "onFailure called ", Toast.LENGTH_SHORT).show(); call.cancel(); } }); } public boolean checkValidation() { userId = et_Email.getText().toString(); password = et_Pass.getText().toString(); Log.e("Keshav", "userId is -> " + userId); Log.e("Keshav", "password is -> " + password); if (et_Email.getText().toString().trim().equals("")) { CommonMethod.showAlert("UserId Cannot be left blank", MainActivity.this); return false; } else if (et_Pass.getText().toString().trim().equals("")) { CommonMethod.showAlert("password Cannot be left blank", MainActivity.this); return false; } return true; } }
CommonMethod.java
public class CommonMethod { public static final String DISPLAY_MESSAGE_ACTION = "com.codecube.broking.gcm"; public static final String EXTRA_MESSAGE = "message"; public static boolean isNetworkAvailable(Context ctx) { ConnectivityManager connectivityManager = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } public static void showAlert(String message, Activity context) { final AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage(message).setCancelable(false) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); try { builder.show(); } catch (Exception e) { e.printStackTrace(); } } }
activity_main.xml
<LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/imgLogin" android:layout_width="200dp" android:layout_height="150dp" android:layout_gravity="center" android:layout_marginTop="20dp" android:padding="5dp" android:background="@mipmap/ic_launcher_round" /> <TextView android:id="@+id/txtLogo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/imgLogin" android:layout_centerHorizontal="true" android:text="Holostik Track and Trace" android:textSize="20dp" android:visibility="gone" /> <android.support.design.widget.TextInputLayout android:id="@+id/textInputLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/box_layout_margin_left" android:layout_marginRight="@dimen/box_layout_margin_right" android:layout_marginTop="8dp" android:padding="@dimen/text_input_padding"> <EditText android:id="@+id/edtEmail" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:ems="10" android:fontFamily="sans-serif" android:gravity="top" android:hint="Login ID" android:maxLines="10" android:paddingLeft="@dimen/edit_input_padding" android:paddingRight="@dimen/edit_input_padding" android:paddingTop="@dimen/edit_input_padding" android:singleLine="true"></EditText> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/textInputLayout2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/textInputLayout1" android:layout_marginLeft="@dimen/box_layout_margin_left" android:layout_marginRight="@dimen/box_layout_margin_right" android:padding="@dimen/text_input_padding"> <EditText android:id="@+id/edtPass" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:fontFamily="sans-serif" android:hint="Password" android:inputType="textPassword" android:singleLine="true" /> </android.support.design.widget.TextInputLayout> <RelativeLayout android:id="@+id/rel12" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textInputLayout2" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" > <Button android:id="@+id/loginSub" android:layout_width="wrap_content" android:layout_height="45dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/border_button" android:paddingLeft="30dp" android:paddingRight="30dp" android:layout_marginRight="10dp" android:text="Login" android:textColor="#ffffff" /> </RelativeLayout> </LinearLayout>
This is a simple solution where we do not need to use JSON
public interface RegisterAPI {@FormUrlEncoded@POST("/RetrofitExample/insert.php")public void insertUser( @Field("name") String name, @Field("username") String username, @Field("password") String password, @Field("email") String email, Callback<Response> callback);}
method to send data
private void insertUser(){ //Here we will handle the http request to insert user to mysql db //Creating a RestAdapter RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(ROOT_URL) //Setting the Root URL .build(); //Finally building the adapter //Creating object for our interface RegisterAPI api = adapter.create(RegisterAPI.class); //Defining the method insertuser of our interface api.insertUser( //Passing the values by getting it from editTexts editTextName.getText().toString(), editTextUsername.getText().toString(), editTextPassword.getText().toString(), editTextEmail.getText().toString(), //Creating an anonymous callback new Callback<Response>() { @Override public void success(Response result, Response response) { //On success we will read the server's output using bufferedreader //Creating a bufferedreader object BufferedReader reader = null; //An string to store output from the server String output = ""; try { //Initializing buffered reader reader = new BufferedReader(new InputStreamReader(result.getBody().in())); //Reading the output in the string output = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } //Displaying the output as a toast Toast.makeText(MainActivity.this, output, Toast.LENGTH_LONG).show(); } @Override public void failure(RetrofitError error) { //If any error occured displaying the error as toast Toast.makeText(MainActivity.this, error.toString(),Toast.LENGTH_LONG).show(); } } );}
Now we can get the post request using php aur any other server side scripting.
Source Android Retrofit Tutorial
I have found the solution. The issue was a problem in my classes structure. So i updated them like the following samples.
public class LandingPageReport { private ArrayList<LandingPageReportItem> GetDetailWithMonthWithCodeResult; // + Getter Setter methods}public class LandingPageReportItem { private String code; private String field1; // + Getter Setter methods}
And then i use this retrofit configuration
@POST("/GetDetailWithMonthWithCode")void getLandingPageReport(@Field("code") String code, @Field("monthact") String monthact, Callback<LandingPageReport> cb);