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

标签 java android xmlhttprequest

我必须(通过 Android 按钮)向 Java Servlet 发送 HTTP 请求。

我被困在必须放置信息(代码)及其必须包含的内容才能发送的位置。

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

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

我知道这与“授予访问权限”按钮的 ID 有关。

安卓 list :

  <?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 类:
账户 Activity

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


    }


}

主要 Activity :

    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

最佳答案

据我了解,您想在单击按钮 @+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有关异步处理的更详细描述。

关于java - 通过 Android 按钮发送 HTTP-POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41442811/

相关文章:

java - Eclipse Gradle 插件 : <some pom file> cannot be read or is not a valid ZIP file

java - 在这种情况下继承和多态性如何工作?

javascript - 除非在 URL 中提供参数,否则 IE8 AJAX GET setRequestHeaders 不起作用

javascript - xhr 在 Firefox 上发布数据和页面重定向 : NS_BINDING_ABORTED

android - 在 Android 启动 Activity 中为 windowBackground 保持正确的纵横比

dojo/request/xhr 返回 xml 而不是 json

java - 如何使用 Hector 检索 Cassandra 键空间/列族中键列的名称?

java - Spring "hello world"示例错误 : A JNI error has occured & NoClassDefFoundError: org/springframework/beans/factory/ListableBeanFactory

java.lang.NoSuchMethodException : [class android. app.Activity,int]

java - Android:在java中的ListView菜单中定位项目?