Запрос HTTP POST вызывает исключение FileNotFound (но работает в Postman)

Я новичок в Android и собираюсь написать свое первое приложение, взаимодействующее с REST-API. Мне удалось выполнить запрос GET, но возникли проблемы с запросом POST. В Postman все работает — на Android мой AsyncTask выдает исключение FileNotFound каждый раз, когда я пытаюсь выполнить запрос POST.

Следуя документации API, мне сначала нужно получить «токен доступа» с помощью HTTP-запроса GET (https://vereinsflieger.de/interface/rest/auth/accesstoken). Мне это удалось сделать. Используя токен доступа, я теперь хочу войти в систему с запросом POST на https://vereinsflieger.de/interface/rest/auth/signin. По какой причине я не знаю, моя AsyncTask выдает исключение FileNotFound, хотя файл есть (работает без проблем в Postman). Есть ли проблема с кодом, который я использую, или с самим API?

Заранее спасибо!

Вот моя попытка:

public class HttpPostRequest extends AsyncTask<String, Void, String> {

    public static final String REQUEST_METHOD = "POST";
    public static final int READ_TIMEOUT = 15000;
    public static final int CONNECTION_TIMEOUT = 15000;
    public String result;
    public LoginActivity LoginActivity;

    public HttpPostRequest(LoginActivity a) { this.callingActivity = a; }

    @Override
    protected String doInBackground(String... params) {
        String stringURL = params[0];
        String logindata = params[1];
        String inputLine;
        try {
            //create URL object
            URL myUrl = new URL(stringURL);
            //create connection
            HttpsURLConnection connection = (HttpsURLConnection) myUrl.openConnection();

            //Set methods and timeouts
            connection.setRequestMethod(REQUEST_METHOD);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);
            **connection.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
            wr.write(logindata);
            wr.flush();**

            Log.d("RESPONSE", "" + connection.getResponseCode());

            //Create a new InputStreamReader
            InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());
            //Create a new buffered reader and String Builder
            BufferedReader reader = new BufferedReader(streamReader);
            **StringBuilder stringBuilder = new StringBuilder();** //Here is where the exception is thrown
            //Check if the line we are reading is not null
            while((inputLine = reader.readLine()) != null){
                stringBuilder.append(inputLine);
            }
            //Close our InputStream and Buffered reader
            reader.close();
            streamReader.close();
            //Set our result equal to our stringBuilder
            result = stringBuilder.toString();
        } catch(IOException e){
            e.printStackTrace();
            result = null;
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        LoginActivity.onPostFinish(result);

    }
}

Я ожидал возврата строки, содержащей данные JSON, вместо этого я получаю следующее исключение:

W/System.err: java.io.FileNotFoundException: https://vereinsflieger.de/interface/rest/auth/signin
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:250)
W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)

Вам нужно создать новое соединение для запроса POST

dazito 23.03.2019 21:49

Хорошо, но что это значит для моего кода? Каким образом я должен открыть новое соединение?

Nico 24.03.2019 10:53

Вы повторно используете соединение. Как только вы используете соединение, оно исчезает (вы также должны закрыть соединение после того, как вы прочитали его). Итак, создайте новое соединение для запроса POST, как вы сделали для запроса GET. URL myUrl2ndConnection = new URL(postURL); HttpsURLConnection secondConnection = (HttpsURLConnection) myUrl2ndConnection.openConnection(); и так далее...

dazito 24.03.2019 14:36

Я пробовал это, но не смог избавиться от исключения FileNotFound :/ Вчера я переключился на библиотеку Google Volley, и теперь все работает, как и ожидалось, очень просто. Спасибо за помощь!

Nico 25.03.2019 16:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
715
0

Другие вопросы по теме