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

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

E / ERROR :: method не поддерживает тело запроса: 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 голос
/ 20 апреля 2019

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

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

Обычно я использую Залп для выполнения вызовов 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 + "&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 с помощью Почтальона и получил следующий ответ.

enter image description here

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

...