Как отправить HttpPost запрос в Андроид 4 и выше используя DefaultHttpClient [устаревшее]

Закрито
Аватар користувача
admin
Администратор
Повідомлень: 26
З нами з: 11 травня 2020, 12:32

Как отправить HttpPost запрос в Андроид 4 и выше используя DefaultHttpClient [устаревшее]

Повідомлення admin »

Чтобы отправить POST-запрос в андроид я сделал отдельный класс для упрощения самого запроса. Передача происходит используя класс DefaultHttpClient.
Исходные файлы представлены ниже.
Суть процесса такова:
  1. В файл strings.xml записываем свой url, который будет обрабатывать наш POST-запрос.

    Код: Виділити все

    <string name="urlpost">http://starcity.in.ua/myindex.php</string>
  2. В каждом активити вы должны будете изменять переменную context своего активити на свой класс, где она применяется, в данном случае это MainActivity.

    Код: Виділити все

    Context context = MainActivity.this;
  3. Если не нужно отображать всплывающее окошко во время выполнения запроса можно дописать строку как в первом запросе:

    Код: Виділити все

    myshowdialog = false;
    Но при этом второй запрос по умолчанию будет отображать это окно, если же надо по умолчанию не отображать, тогда измените в начале класса переменную myshowdialog на false;

    Код: Виділити все

    boolean myshowdialog = false;
    и ниже в коде также произведите следующую замену на false

    Код: Виділити все

                if (myshowdialog)
                    myhttppost.MyDialogStop();
                else
                    myshowdialog = false;
    
  4. Очищаем предыдущий запрос (в принципе если это первый запрос в нашем активити, то можно удалить эту строку, но при втором обращении она всё же необходима):

    Код: Виділити все

    hmqr.clear();
  5. Передаем POST-переменные и их значения, их может быть сколько угодно. К примеру:

    Код: Виділити все

    hmqr.put("action", "value1");
    hmqr.put("key", "value1a");
  6. Отправляем запрос и прописываем название функции, которая будет обрабатывать ответ от сервера:

    Код: Виділити все

    new MyReqTask().execute("name_function1");
  7. Метод MyReturn запускается сразу же после того как придет ответ от сервера и в нем запускается функция, название которой мы указали в предыдущем пункте.
    Ответ передается в переменную jsonans, далее собственно проделываем все необходимые нам операции в соответствующей функции.
    Здесь я сразу же перевел ответ в JSON-формат в переменную resjson.

    Код: Виділити все

    JSONObject resjson = new JSONObject(jsonans);
  8. ВНИМАНИЕ:
    Здесь в моем примере я добавил проверку ответа сервера. В ответе на сервере я добавил переменную result равную 1, ну и делается проверка дошла ли эта переменная назад. Если же она равна 0, тогда выдаем ошибку.

    Код: Виділити все

    result = resjson.getInt("result");
    if (result == 0)
        Toast.makeText(getApplicationContext(), getResources().getText(R.string.errorotvet), Toast.LENGTH_LONG).show();
P.S.: Для тех, кто в своем проекте использует гугл карты, - класс DefaultHttpClient будет работать только с версией гугл карт 16.0.0. При установке версии implementation 'com.google.android.gms:play-services-maps:17.0.0 данный пример не работает!!!

Код: Виділити все

implementation 'com.google.android.gms:play-services-maps:16.0.0'
Необходимые файлы и изменения:

Файл activity_main.xml не привожу, он может быть любой разметки.

Добавляем в build.gradle (Module:app)

Код: Виділити все

apply plugin: 'com.android.application'

android {
.....
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }
}

dependencies {
.....
    //noinspection DuplicatePlatformClasses
    implementation 'org.apache.httpcomponents:httpclient:4.5.6'
}
Добавляем в strings.xml

Код: Виділити все

<resources>
.....
    <string name="urlpost">http://starcity.in.ua/myindex.php</string>
    <string name="dowloadtext">Загружаю данные…</string>
    <string name="errorotvet">Ошибка сервера!\nНеверный ответ!</string>
    <string name="errorfunction1">Ошибка!\nФункция &lt;</string>
    <string name="errorfunction2">> не определена!\nОтвет сервера:\n</string>
</resources>
Добавляем в AndroidManifest.xml

Код: Виділити все

<uses-permission android:name="android.permission.INTERNET" />
.....
<activity android:name=".MyHttpPost" />
Файл MainActivity.java

Код: Виділити все

package ua.in.starcity.myhttppost;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

public class MainActivity extends Activity {

    Context context = MainActivity.this;
    MyHttpPost myhttppost = new MyHttpPost(context);
    HashMap<String, String> hmqr = new HashMap<>();
    boolean myshowdialog = true;

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

        hmqr.clear();
        hmqr.put("action", "value1");
        hmqr.put("key", "value1a");
        myshowdialog = false;
        new MyReqTask().execute("name_function1");

        hmqr.clear();
        hmqr.put("action", "value2");
        hmqr.put("key", "value2a");
        new MyReqTask().execute("name_function2");
    }

    @SuppressLint("StaticFieldLeak")
    class MyReqTask extends AsyncTask<String, String, HashMap<String, String>> {
        protected HashMap<String, String> doInBackground(String... params) {
            HashMap<String, String> hmans = new HashMap<>();
            hmans.put("function", params[0]);
            hmans.put("query", myhttppost.query(hmqr));
            return hmans;
        }

        protected void onPostExecute(HashMap<String, String> result) {
            super.onPostExecute(result);
            if (myshowdialog)
                myhttppost.MyDialogStop();
            else
                myshowdialog = true;
            MyReturn(result);
        }

        protected void onPreExecute() {
            super.onPreExecute();
            if (myshowdialog)
                myhttppost.MyDialogStart();
        }
    }

    private void MyReturn(HashMap<String, String> hmret) {
        int result;
        String jsonans = hmret.get("query");
        String function = hmret.get("function");
        if (function != null && jsonans != null) {
            try {
                JSONObject resjson = new JSONObject(jsonans);
                result = resjson.getInt("result");
                if (result == 0)
                    Toast.makeText(getApplicationContext(), getResources().getText(R.string.errorotvet), Toast.LENGTH_LONG).show();
                switch (function) {
                    case "name_function1":
                        Toast.makeText(getApplicationContext(), "name_function1="+jsonans, Toast.LENGTH_LONG).show();
                        break;
                    case "name_function2":
                        Toast.makeText(getApplicationContext(), "name_function2="+jsonans, Toast.LENGTH_LONG).show();
                        break;
                    case "name_function3":
                        break;
                    case "name_function4":
                        break;
                    case "name_function5":
                        break;
                    case "name_function6":
                        break;
                    case "name_function7":
                        break;
                    case "name_function8":
                        break;
                    case "name_function9":
                        break;
                    default:
                        Toast.makeText(getApplicationContext(), getResources().getText(R.string.errorfunction1)+function+getResources().getText(R.string.errorfunction2) + jsonans, Toast.LENGTH_LONG).show();
                        break;
                }
            } catch (JSONException ignored) {
            }
        }
    }

}
Файл MyHttpPost.java

Код: Виділити все

package ua.in.starcity.myhttppost;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;

import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MyHttpPost extends Activity {
    private final Context context;
    ProgressDialog dialog;

    public MyHttpPost(Context context) {
        this.context = context;
    }

    public String query(HashMap<String, String> hm) {
        String response = null;
        try {
            DefaultHttpClient hc = new DefaultHttpClient();
            ResponseHandler<String> res = new BasicResponseHandler();
            HttpPost postMethod = new HttpPost(context.getString(R.string.urlpost));
            List<NameValuePair> nameValuePairs = new ArrayList<>(hm.size());
            for (HashMap.Entry<String, String> pair : hm.entrySet())
                nameValuePairs.add(new BasicNameValuePair(pair.getKey(), pair.getValue()));
            postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            response = hc.execute(postMethod, res);
        } catch (Exception ignored) {
        }
        return response;
    }

    void MyDialogStart() {
        dialog = new ProgressDialog(context);
        dialog.setMessage(context.getString(R.string.dowloadtext));
        dialog.setIndeterminate(true);
        dialog.setCancelable(true);
        dialog.show();
    }

    void MyDialogStop() {
        dialog.dismiss();
    }

}
Закрито