当服务器需要更长时间响应时,HttpURLConnection POST响应会丢失

时间:2016-11-28 12:01:43

标签: android android-asynctask httpurlconnection

我无法捕获对服务器的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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

经过第二次思考我有一个理论 我会详细解释

但首先尝试使用此代码来编写数据

从您的代码中移除此内容:

SELECT *
FROM tbl1 t1
WHERE (
    SELECT COUNT (*)
    FROM tbl1 t2
    WHERE t2.Zip = t1.Zip AND t2.Rating = t1.Rating
) > 1

使用此:

OutputStream os = new BufferedOutputStream(urlConnection.getOutputStream());
os.write(message.getBytes());
os.flush();
os.close();

如果有效,那么我将编辑这个答案并解释更多。

根据OP评论,这个答案没有帮助。 我保留这个以防万一我找到别的东西,否则,我会在以后删除它。