【问题标题】:Send a HTTP-POST Request Through Android Button通过 Android 按钮发送 HTTP-POST 请求
【发布时间】:2017-05-17 12:05:44
【问题描述】:

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

我被困在我必须放置信息(代码)以及它必须包含什么才能发送它的地方。

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

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

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

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

【问题讨论】:

    标签: java android xmlhttprequest


    【解决方案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 以获取有关异步处理的更多详细说明。

    【讨论】:

      【解决方案2】:

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

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

      看看如何设置 Retrofit 以及如何在他们的页面上创建 POST 调用:https://square.github.io/retrofit/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多