通过Android按钮发送HTTP-POST请求

时间:2017-01-03 11:46:25

标签: java android xmlhttprequest

我必须将HTTP-Request(通过Android按钮)发送到Java Servlet。

我被困在必须放置信息(代码)以及发送它必须包含的内容。

上下文:用户登录 - >点击"授予访问权限" - >向HTTP Servlet发送HTTP请求(例如192.168.1.1)

注意:我只是Android的初学者。

我知道它与按钮的ID有关" 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(如果用户成功登录):

    <?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>

我使用的Java类:
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

2 个答案:

答案 0 :(得分:1)

据我了解,您希望在点击按钮@+id/grantAccess时进行HTTP POST。 首先,您必须在AccountActivity类中添加OnClickListener。就像你为logout按钮所做的那样。在onClick方法中,您现在可以发出HTTP请求。因此,您必须创建AyncTask,因为不允许您通过应用程序主线程进行HTTP调用。

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);
     }
}

onClick方法中,您创建了PostTask的实例,其中包含:

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

就像tudor07所说,你可以使用各种http客户端框架。在这种情况下,我使用Spring for Android(http://projects.spring.io/spring-android/)完成了它。在显示的链接中,还有一个如何将此库添加到项目的说明。请访问https://developer.android.com/reference/android/os/AsyncTask.html以获取有关异步处理的更多详细说明。

答案 1 :(得分:0)

为了能够通过HTTP进行通信,您需要一个HTTP客户端框架,该框架可以在您指定的URL处发出HTTP请求,并使用您指定的HTTP方法和参数/主体。

一个非常流行的Android框架是Retrofit。 Retrofit将允许您使用您想要的任何参数进行POST调用。

了解如何设置Retrofit以及如何在其页面上创建POST调用:https://square.github.io/retrofit/