HTTP-запрос не работает?

Я пытаюсь создать приложение, которое отправит некоторые данные на веб-сервер, когда будет нажата кнопка, и данные будут из формы. Типы данных: имя, фамилия и другие. Я начинающий разработчик и пробую плагин OKHTTPFClient для отправки HTTP-запроса из приложения. Мне нужно, чтобы при щелчке данные формы были отправлены в PHP, а затем PHP даст успешный ответ, который затем получит приложение, а затем действие будет перенаправлено, чтобы поблагодарить вас за активность. Вот код, который я сейчас пробую -

submitRequest.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if ( firstName.getText().toString().length() == 0 ) {
                firstName.setError("Please enter your first name!");
            }
            if ( firstName.getText().toString().length() != 0 ) {

                Toast.makeText(getApplicationContext(), firstName.getText().toString(), Toast.LENGTH_SHORT).show();

                requestHTTP(firstName.getText().toString());

            } else {

            }
        }
    });

А вот метод для OKHTTPClient -

private void requestHTTP(String first_name) {
    OkHttpClient httpClient = new OkHttpClient();
    String url = "https://www.example.com/action.php";

    RequestBody formBody = new FormBody.Builder()
            .add("first_name", first_name)
            .build();
    Request request = new Request.Builder()
            .url(url)
            .post(formBody)
            .build();
    Response response = null;
    try {
        response = httpClient.newCall(request).execute();
        if (response.isSuccessful()) {
            Toast.makeText(getApplicationContext(), firstName.getText().toString(), Toast.LENGTH_SHORT).show();
        }

    } catch (IOException e) {

    }
}

ОБНОВЛЕНИЕ:

Вот ошибки, отображаемые в разделе Android Run:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.androidapp, PID: 11592
              android.os.NetworkOnMainThreadException
                  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
                  at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
                  at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
                  at java.net.InetAddress.getAllByName(InetAddress.java:752)
                  at okhttp3.Dns$1.lookup(Dns.java:39)
                  at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:185)
                  at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:149)
                  at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:84)
                  at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:213)
                  at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
                  at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
                  at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
                  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
                  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
                  at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
                  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
                  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
                  at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
                  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
                  at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
                  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
                  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
                  at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
                  at okhttp3.RealCall.execute(RealCall.java:77)
                  at org.goldenfs.payoffcalculator.advisor.requestHTTP(advisor.java:220)
                  at org.goldenfs.payoffcalculator.advisor.access$000(advisor.java:38)
                  at org.goldenfs.payoffcalculator.advisor$4.onClick(advisor.java:188)
                  at android.view.View.performClick(View.java:6261)
                  at android.widget.TextView.performClick(TextView.java:11180)
                  at android.view.View$PerformClick.run(View.java:23748)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6776)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

Приложение прекращено.

Пожалуйста, помогите мне решить эту проблему. Я очень ценю вашу помощь... :)


person eatherpro    schedule 11.11.2017    source источник
comment
напечатать response.body().string(), если условие ЕСЛИ   -  person IntelliJ Amiya    schedule 11.11.2017
comment
Позвольте мне также добавить ошибки из консоли!   -  person eatherpro    schedule 11.11.2017
comment
Почему бы вам просто не использовать AsyncTask?   -  person Aswin P Ashok    schedule 11.11.2017
comment
Я новичок и не знаю, как использовать AsyncTask, и, возможно, поэтому возникает эта проблема!   -  person eatherpro    schedule 11.11.2017


Ответы (2)


android.os.NetworkOnMainThreadException в android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)

Вы должны использовать THREAD .

    //A thread is a thread of execution in a program.
    // The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.
    Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            try
            {

                            OkHttpClient httpClient = new OkHttpClient();
                            String url = "https://www.example.com/action.php";

                            RequestBody formBody = new FormBody.Builder()
                                    .add("first_name", first_name)
                                    .build();
                            Request request = new Request.Builder()
                                    .url(url)
                                    .post(formBody)
                                    .build();
                            Response response = null;
                            try {
                                response = httpClient.newCall(request).execute();
                                if (response.isSuccessful()) {
                                    Toast.makeText(getApplicationContext(), firstName.getText().toString(), Toast.LENGTH_SHORT).show();
                                }

                            } catch (IOException e) {

                            }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();

Из OkHttp.

person IntelliJ Amiya    schedule 11.11.2017
comment
@EatherAhmed stackoverflow.com/questions/3875184/ - person IntelliJ Amiya; 11.11.2017
comment
@EatherAhmed stackoverflow.com/a/27599969/3395198 - person IntelliJ Amiya; 11.11.2017
comment
Использование нити — это нормально. Но вы не можете отображать Toast в потоке. Тогда вы получите такие ошибки. - person greenapps; 11.11.2017
comment
@greenapps в таком случае мы должны runOnUiThread - person IntelliJ Amiya; 11.11.2017
comment
Я не вижу, чтобы вы использовали runOnUiThread(). - person greenapps; 11.11.2017
comment
@greenapps извините, здесь я не добавил это. - person IntelliJ Amiya; 11.11.2017

Он выдает ошибку, потому что вы пытаетесь выполнить сетевую операцию в MainThread, чего делать не следует. Пожалуйста, добавьте строки ниже и попробуйте,

  public void onViewCreated(View view, Bundle savedInstanceState) 
    {
        int SDK_INT = android.os.Build.VERSION.SDK_INT;
        if (SDK_INT > 8) 
        {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
            //your codes here

        }
    }

ИЛИ Вы можете вызвать свой метод в AsyncTask, который не работает в MainThread.

private class YourAsyncTaskName extends AsyncTask<String, Void, String> {

        String data;
        public YourAsyncTaskName(String data){
            this.data= data;
         }

        @Override
        protected String doInBackground(String... params) {
            requestHTTP(data);
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }

А теперь выполните свою AsyncTask

submitRequest.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if ( firstName.getText().toString().length() == 0 ) {
                firstName.setError("Please enter your first name!");
            }
            if ( firstName.getText().toString().length() != 0 ) {

                Toast.makeText(getApplicationContext(), firstName.getText().toString(), Toast.LENGTH_SHORT).show();

                new YourAsyncTaskName(firstName.getText().toString()).execute();


            } else {

            }
        }
    });
person Kuls    schedule 11.11.2017
comment
Не могли бы вы поделиться, как запустить этот метод в AsyncTask? Это будет большим подспорьем для меня и других новичков! - person eatherpro; 11.11.2017
comment
@EatherAhmed Проверить сейчас - person Kuls; 11.11.2017
comment
@EatherAhmed Если это вам поможет, вы можете пометить его как ответ и принять его. Это было бы полезно для других. - person Kuls; 11.11.2017
comment
Пожалуйста, не рекламируйте этот грязный код StrictMode. И не просите принять ваш ответ. - person greenapps; 11.11.2017
comment
С какой стати код StrictMode грязный? И я спросил, потому что другие могут определить, что это работает. @greenapps - person Kuls; 11.11.2017
comment
@KulsDroid Сейчас работает над моим приложением... :D - person eatherpro; 11.11.2017