Я новичок в 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, как вы сделали для запроса GET. URL myUrl2ndConnection = new URL(postURL); HttpsURLConnection secondConnection = (HttpsURLConnection) myUrl2ndConnection.openConnection(); и так далее...
Я пробовал это, но не смог избавиться от исключения FileNotFound :/ Вчера я переключился на библиотеку Google Volley, и теперь все работает, как и ожидалось, очень просто. Спасибо за помощь!




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