How to get a response from the POST request, thanks in advance. Call in Maine:

new DoPOSTInBackground().execute(key) String[] key = {"qwerty"}; 

The class itself:

  package com.admin.post; import android.os.AsyncTask; import java.io.IOException; import java.util.ArrayList; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; class DoPOSTInBackground extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... keys) { OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("name_form", "key_client") .add("key", keys[0]) .build(); Request request = new Request.Builder() .url("http://example.ru/index.php") .post(formBody).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { System.out.println(response.body().string()); } }); return null; } } 
  • so you already get it in response().body().string() , no? - Mansur Nashaev
  • @MansurNashaev yes, but I need the response in other parts of the code, how to render it? - Dmitry Ushkevich
  • Decide what you are going to use, AsyncTask or an asynchronous request. Then I can answer you correctly - Mansur Nashaev

3 answers 3

Option 2. Without using AsyncTask

 class CoreOkHttpPost { //слушатель событий, будет оповещен, когда запрос закончит выполняться. private PostRequestListener postRequestListener; public void setPostRequestListener(PostRequestListener postRequestListener) { this.postRequestListener = postRequestListener; } public void makePostRequest(){ OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("name_form", "key_client") .add("key", keys[0]) .build(); DownloadManager.Request request = new Request.Builder() .url("http://example.ru/index.php") .post(formBody).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { System.out.println("post request failed"); } @Override public void onResponse(Call call, final Response response) throws IOException { //берем ответ от сервера final String responseString = response.body().string(); //Так как enqueue выполняется в отдельном потоке, соответственно //onResponse тоже будет выполнен в том же (отдельном от главного) потоке. //Активити и фрагменты не любят когда трогают View-элементы не в main потоке, //поэтому решаем эту проблему Handler'ом. Иначе будет Exception. new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { notifyRequestExecuted(responseString); } }); } }); } //оповещение можно вынести в отдельный метод private void notifyRequestExecuted(String response){ if (postRequestListener != null) { postRequestListener.onResponse(response); } } public interface PostRequestListener{ void onResponse(String response); } 

}

Activate or fragment

 public class ActivityOrFragment implements CoreOkHttpPost.PostRequestListener { void makeRequest(){ CoreOkHttpPost coreOkHttpPost = new CoreOkHttpPost(); coreOkHttpPost.makePostRequest(); coreOkHttpPost.makePostRequest(); } @Override public void onResponse(String response) { //твой ответ здесь } 

}

  • Thanks a lot, I used the 2nd version without AsyncTask - Dmitry Ushkevich

You did an extra job. You have created an asynchronous task and asynchronously send a request to it. You only have one asynchrony. Those. or remove the asynchronous call request to the server or remove AsinkTask altogether.

  • Thank you, you are right. Can you tell me how to assign response to a variable from OnResponse? - Dmitry Ushkevich
  • Well .. the variable name is equal to the value ... - Yuriy SPb

Okay, I'll sign both options.

Option 1. Using the AsyncTask class

class DoPOSTInBackground

 class DoPOSTInBackground extends AsyncTask<String, Void, String> { //сюда будет помещен ответ от сервера private String mResponseString; //слушатель событий, будет оповещен, когда запрос закончит выполняться. private PostRequestListener postRequestListener; public void setPostRequestListener(PostRequestListener postRequestListener) { this.postRequestListener = postRequestListener; } @Override protected String doInBackground(String... keys) { OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("name_form", "key_client") .add("key", keys[0]) .build(); DownloadManager.Request request = new Request.Builder() .url("http://example.ru/index.php") .post(formBody).build(); //doInBackground вызывается в отдельном потоке, значит //execute() можно вызывать прямо здесь. //Метод enqueue(), в отличие от него, вызывается в отдельном потоке //поэтому в данном случае нет смысла этого делать. client.newCall(request).execute(); return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); //onPostExecute вызывается на главном потоке, поэтому никаких проблем //нет, можно отправлять событие слушателю. if (postRequestListener != null) { postRequestListener.onResponse(mResponseString); } } public interface PostRequestListener{ void onResponse(String response); } 

}

Activate or fragment

 public class ActivityOrFragment implements DoPOSTInBackground.PostRequestListener { void makeRequest(){ DoPOSTInBackground task = new DoPOSTInBackground().execute(); task.setPostRequestListener(this); } @Override public void onResponse(String response) { //твой придет сюда. } 

}