Send a HTTP-POST Request Through Android Button

Question

I have to send an HTTP-Request (through an Android button) to a Java Servlet.

I am stuck where I have to put the information (code) and what it must contain in order to send it.

Context: User Logs in --> Clicks on "Grant Access" --> Sends an HTTP-Request to Java Servlet(for example 192.168.1.1)

Note: I'm just a beginner in Android.

I know that it has to do with the ID of the button "Grant Access".

**AndroidManifest**

  <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mertino11.ourapplication">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".FireApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true">

        <activity
            android:name=".MainActivity"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity
            android:name=".AccountActivity"
            android:theme="@style/AppTheme" />
    </application>

    </manifest>

**Activity_main_xml**


    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:baselineAligned="false">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="163dp"
        app:srcCompat="@drawable/snetech"
        android:id="@+id/imageView" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        android:ems="10"
        android:id="@+id/emailField"
        android:hint="Email"
        android:paddingTop="20dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/passwordField"
        android:hint="Password"
        android:fontFamily="sans-serif"
        android:paddingTop="20dp" />

    <Button
        android:text="Login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/loginBtn"
        android:paddingTop="20dp" />

</LinearLayout>



**Activity_account (If user logs successful)**

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_account"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.mertino11.ourapplication.AccountActivity">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="logout"
        android:id="@+id/logout"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="16dp" />

    <Button
        android:text="Grant Access"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/grantAccess"
        android:layout_marginBottom="70dp"
        android:layout_above="@+id/logout"
        android:layout_centerHorizontal="true" />

    <TextView
        android:text="Main Menu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:textStyle="normal|bold"
        android:textSize="30sp"
        android:textAlignment="center"
        android:fontFamily="sans-serif"
        android:textAllCaps="false"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

**The Java Classes I use:**


**AccountActivity**

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;

    import com.google.firebase.auth.FirebaseAuth;
    public class AccountActivity extends AppCompatActivity {


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

        Button logout=(Button) findViewById(R.id.logout);
        logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth.getInstance().signOut();
                startActivity(new Intent(AccountActivity.this,MainActivity.class));
                finish();
            }
        });


    }


}



**MainActivity**

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;

    import com.google.android.gms.tasks.OnCompleteListener;
    import com.google.android.gms.tasks.Task;
    import com.google.firebase.auth.AuthResult;
    import com.google.firebase.auth.FirebaseAuth;

    public class MainActivity extends AppCompatActivity {

    private EditText mEmailField;
    private EditText mPasswordField;

    private Button mLoginBtn;

    private FirebaseAuth mAuth;

    private FirebaseAuth.AuthStateListener mAuthListener;

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

        mAuth = FirebaseAuth.getInstance();

        mEmailField = (EditText) findViewById(R.id.emailField);
        mPasswordField = (EditText) findViewById(R.id.passwordField);

        mLoginBtn = (Button) findViewById(R.id.loginBtn);

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                if(firebaseAuth.getCurrentUser() != null) {

                    startActivity(new Intent(MainActivity.this, AccountActivity.class));

                }
            }
        };

        mLoginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                startSignIn();

            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        mAuth.addAuthStateListener(mAuthListener);
    }

    private void startSignIn() {

        String email = mEmailField.getText().toString();
        String password = mPasswordField.getText().toString();

        if(TextUtils.isEmpty(email) || TextUtils.isEmpty(password)) {

            Toast.makeText(MainActivity.this, "Fields are empty!", Toast.LENGTH_LONG).show();

        } else {
            mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {

                    if(!task.isSuccessful()){

                        Toast.makeText(MainActivity.this, "Sign In Problem!", Toast.LENGTH_LONG).show();
                    }
                }
            });
        }



    }
}



**FireApp**

    import android.app.Application;

    import com.firebase.client.Firebase;


    public class FireApp extends Application {
    @Override
    public void  onCreate() {
      super.onCreate();

     Firebase.setAndroidContext(this);
    }
    }

Login Screen User enters his Main Menu


Show source
| java   | android   | xml   | android-studio   | xmlhttprequest   2017-01-03 12:01 2 Answers

Answers ( 2 )

  1. 2017-01-03 12:01

    To be able to communicate trough HTTP you need an HTTP client framework that can make HTTP request at an URL you specify and with a HTTP method and parameters/body you specify.

    One very popular framework for Android is Retrofit. Retrofit will allow you to make a POST call with whatever parameters you want.

    Take a look at how to set up Retrofit and how to create a POST call on their page: https://square.github.io/retrofit/

  2. 2017-01-03 14:01

    As I understand you want to make an HTTP POST while clicking on button @+id/grantAccess. First you have to add an OnClickListener in your AccountActivity class. Like you did it for the logout button. In the onClick method you can now make your HTTP request. Therefore you have to create an AyncTask because you are not allowed to make HTTP calls over the applications main thread.

    public class PostTask extends AsyncTask<Void, Void, Void> {
    
        private static final String ENDPOINT = "http://yourendpoint/";
    
        PostTask() {
                //add here your variables that you need
        }
    
        @Override
        protected void doInBackground(Void... params) {
           this.doPost();
        }
    
        @Override
        protected void onPostExecute() {
            //do what you want when you are finished
        }
    
        private void doPost(){
            final RestTemplate restTemplate = new RestTemplate();
            final RequestObject request = new RequestObject();
    
            //parse the request to a format what is used by your endpoint (json, xml,..)
            HttpEntity<String> entity = new HttpEntity<String>(objectToString(request), createHeaders(authResp));
            final HttpEntity<String> response = restTemplate.exchange(ENDPOINT, HttpMethod.POST, entity, String.class);
         }
    }
    

    In your onClick method you create an instance of the PostTask with:

    new PostTask().execute((Void) null);
    

    Like tudor07 said you can use various http client frameworks. In this case I did it with Spring for Android (http://projects.spring.io/spring-android/). In the link shown there is also a description how to add this library to your project. Visit https://developer.android.com/reference/android/os/AsyncTask.html for a more detail description on the async handling.

◀ Go back