У меня возникли проблемы с получением ответа на POST-запрос к серверу, когда серверу требуется немного больше времени для ответа (когда он передается большим JSONObject
).
Когда мы вызываем метод GET
с более длительным временем отклика, проблем не возникает. Когда мы вызываем POST
и передаем относительно небольшой JSONObject
, метод регистрирует ответ. Метод вызывается из AsyncTask
через new Task().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
.
При срабатывании Postman ответ возвращается через 155 секунд, но приходит. С другой стороны, при запуске из приложения код ничего не делает и в конечном итоге вызывает SocketTimeoutException
. (По какой-то причине у нас есть тайм-аут (тайм-аут подключения и чтения), установленный на 10 минут). Ниже приведен фрагмент кода для метода службы. . Буду признателен за любые подсказки.
public static JSONObject requestWebService(String serviceUrl, JSONObject jsonObject) throws Exception {
private static final int CONNECTION_TIMEOUT = 1000 * 600;
private static final int DATARETREIVAL_TIMEOUT = 1000 * 600
HttpURLConnection urlConnection = null;
try {
URL urlToRequest;
String message;
urlToRequest = new URL(serviceUrl);
urlConnection = (HttpURLConnection) urlToRequest.openConnection();
urlConnection.setConnectTimeout(CONNECTION_TIMEOUT);
urlConnection.setReadTimeout(DATARETREIVAL_TIMEOUT);
if (jsonObject != null) {
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/json");
message = jsonObject.toString();
OutputStream os = new BufferedOutputStream(urlConnection.getOutputStream());
os.write(message.getBytes());
os.flush();
os.close();
} else {
urlConnection.setRequestMethod("GET");
}
int statusCode = urlConnection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
throw new Exception("Acces unauthorized " + statusCode + ".");
} else if (statusCode != HttpURLConnection.HTTP_OK) {
throw new Exception("Server unavailable " + statusCode + ".");
}
return new JSONObject(ReplicationClient.convertInputStreamToString(urlConnection.getInputStream()));
} catch (MalformedURLException e) {
fileLogger.error(logHeader + e.getMessage(), e);
throw new Exception("Error " + e.getMessage(), e);
} catch (SocketTimeoutException e) {
fileLogger.error(logHeader + e.getMessage(), e);
throw new Exception("Error " + e.getMessage(), e);
} catch (IOException e) {
fileLogger.error(logHeader + e.getMessage(), e);
throw new Exception("Error " + e.getMessage(), e);
} catch (JSONException e) {
fileLogger.error(logHeader + e.getMessage(), e);
throw new Exception("Error " + e.getMessage(), e);
} catch (Exception e) {
fileLogger.error(logHeader + e.getMessage(), e);
throw new Exception("Error " + e.getMessage(), e);
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}
CONNECTION_TIMEOUT
иDATARETREIVAL_TIMEOUT
? известно ли вам, что эти методы принимают значение в миллисекундах? я думаю, вы установили значения, как если бы они были секундами? - person Yazan   schedule 28.11.2016urlConnection.setRequestProperty("Content-Length", "" + jsonObject.toString().getBytes("UTF8").length);
поставить сразу послеContent-Type
строки - person Yazan   schedule 29.11.2016