Как получить ответ из POST запроса

564
27 января 2017, 05:33

Как получить ответ из POST запроса, заранее спасибо Вызов в мэйне:

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

Сам класс:

 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; 
      } 
 }
Answer 1

Вы сделали лишнюю работу. Вы создали асинхронную задачу и в ней асинхронно шлёте запрос. Вам досточно всего одной асинхронности. Т.е. или убрать асинхронный вызов запроса к серверу или убрать АсинкТаск вообще.

Answer 2

Ладно, распишу оба варианта.

Вариант 1. Использование класса AsyncTask

класс 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);
}

}

Активити или фрагмент

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

}

Answer 3

Вариант 2. Без использования 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);
}

}

Активити или фрагмент

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

}

READ ALSO
Экземпляр обобщенного класса

Экземпляр обобщенного класса

Компилятор вообще не создает экземпляры обобщенного класса или компилятор не создает более одного экземпляра обобщенного класса?

343
Недостаточная точность типа double

Недостаточная точность типа double

У меня есть метод для деления многочленов с остаткомОн хорошо работает для многочленов, коэффициенты которых делятся точно

401
Как сделать из rectangle кнопку?

Как сделать из rectangle кнопку?

Делаю игру точки, есть rectangle dot(сама точка), хочу сделать, что бы при нажатии на ту или иную кнопку, dot меня свой цвет на красный/синий, но когда...

291
Вывод текста песни с отступами

Вывод текста песни с отступами

Хочу в программе выводить текст песни по куплетам ну типа так:

423