我无法捕获对服务器的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();
}
}
}
答案 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评论,这个答案没有帮助。 我保留这个以防万一我找到别的东西,否则,我会在以后删除它。