java.net.ProtocolException: метод не поддерживает тело запроса: GET

#java #android #post #okhttp

#java #Android #Публикация #okhttp

Вопрос:

Я пытаюсь отправить POST-запрос из android studio и получаю некоторые ошибки, такие как:

E/ERROR:: метод не поддерживает тело запроса: GET java.net.ProtocolException: метод не поддерживает тело запроса: GET

И я не знаю, как это решить. Кто-нибудь может мне помочь?

Это мой основной класс, в котором я отправляю запрос порта

 public class Main2Activity extends AppCompatActivity {
    public TextView content;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        content = (TextView) findViewById(R.id.content);
        new CheckConnectionStatus().execute("https://nonoperational-trad.000webhostapp.com/getuser.php");
    }

    class CheckConnectionStatus extends AsyncTask<String, Void, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            content.setText("");
        }

        protected  String doInBackground(String...params) {
            URL url = null;
            try {
                url = new URL(params[0]);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }

            try {
                HttpURLConnection urlConnection =(HttpURLConnection) url.openConnection();
                urlConnection.setDoInput(true);

                Uri.Builder builder = (Uri.Builder) new Uri.Builder()
                        .appendQueryParameter("username", "d")
                        .appendQueryParameter("password","d");

                OutputStream outputStream= urlConnection.getOutputStream();

                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                bufferedWriter.write(builder.build().getEncodedQuery());
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();
                urlConnection.connect();
                InputStream inputStream = urlConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String s = bufferedReader.readLine();
                bufferedReader.close();
                return s;
            } catch (IOException e) {
                Log.e("ERROR:", e.getMessage(), e);
                e.printStackTrace();
            }
            return null;
        }

        protected void onPostExecute(String s){
            super.onPostExecute(s);
            content.setText(s);
        }
    }
}
  

build.gradle что я добавил — implementation 'com.squareup.okhttp3:okhttp:3.9.1'

Это сообщение об ошибке при отправке запроса!

 E/ERROR:: method does not support a request body: GET
    java.net.ProtocolException: method does not support a request body: GET
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:26)
        at com.example.dato.maptest.Main2Activity$CheckConnectionStatus.doInBackground(Main2Activity.java:65)
        at com.example.dato.maptest.Main2Activity$CheckConnectionStatus.doInBackground(Main2Activity.java:42)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
  

Комментарии:

1. Вы проверили мой ответ? Пожалуйста, дайте мне знать, если это сработает. 🙂

Ответ №1:

Похоже, что API, который вы пытаетесь вызвать, является запросом GET. Следовательно, вам нужно сделать запрос GET (а не POST-запрос).

Несмотря на то, что вы упомянули, что используете OkHttp для вызова API, я не вижу никаких признаков его использования. Я вижу, что вы использовали basic HttpUrlConnection для выполнения запроса к серверу.

Обычно я использую Volley для выполнения вызовов API. Вы можете найти, как использовать Volley для выполнения вызова API по предоставленной ссылке. Здесь я пытаюсь написать некоторый код, однако вам, возможно, придется изменить код в соответствии с вашими потребностями.

Во-первых, вам нужно добавить следующую зависимость в свой build.gradle файл.

 dependencies {
    // ... Your other dependencies go here
    implementation 'com.android.volley:volley:1.1.1'
}
  

Тогда вам просто нужно написать следующий код, в котором вы хотите вызвать этот API.

 String username = "d";
String password = "d";

RequestQueue queue = Volley.newRequestQueue(this);
String url ="https://nonoperational-trad.000webhostapp.com/getuser.php?username="   username   "amp;password="   password;

// Request a String response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        Toast.makeText(Main2Activity.this, response, Toast.LENGTH_LONG).show();
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Toast.makeText(Main2Activity.this, "Fail", Toast.LENGTH_LONG).show();
    }
});

// Add the request to the RequestQueue.
queue.add(stringRequest);
  

Я попытался вызвать API с помощью Postman и получил следующий ответ.

введите описание изображения здесь

Надеюсь, это поможет!