この問題に遭遇した他の人にとっては、リクエスト本文にコンテンツが含まれる HTTP POST を実行しているときにのみ影響を受ける、操作順序の問題がありました。HttpURLConnection が実際にサーバーへの接続を開始している場合、すべてのシナリオで完全に明確というわけではありません。
私の最初のリクエストは次のようになりました。
HttpURLConnection conn = null;
try
{
conn = (HttpURLConnection) baseUrl.openConnection();
conn.setConnectTimeout(connectTimeoutMillis);
conn.setReadTimeout(requestTimeoutMillis);
//required for reading a response body
conn.setDoInput(true);
//Not all request types have a body (e.g. GET usually doesn't)
if(requestBody != null && requestBody.length > 0)
{
conn.setDoOutput(true);
conn.setFixedLengthStreamingMode(requestBody.length);
conn.getOutputStream().write(requestBody);
conn.getOutputStream().flush();
conn.getOutputStream().close();
}
try
{
conn.setRequestMethod(verb.toUpperCase());
}
catch (final ProtocolException e)
{
response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
Log.e(TAG, response.errorMessage, e);
return response;
}
「conn.getOutputStream()」を呼び出した後は「conn.setRequestMethod(...)」を呼び出すことができないことが判明したため、私の場合、簡単な修正は「conn.setRequestMethod(...)」の呼び出しでした。 "リクエストボディへの書き込みを処理する前に。作業コードは次のとおりです。
HttpURLConnection conn = null;
try
{
conn = (HttpURLConnection) baseUrl.openConnection();
conn.setConnectTimeout(connectTimeoutMillis);
conn.setReadTimeout(requestTimeoutMillis);
//required for reading a response body
conn.setDoInput(true);
try
{
conn.setRequestMethod(verb.toUpperCase());
}
catch (final ProtocolException e)
{
response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
Log.e(TAG, response.errorMessage, e);
return response;
}
//Not all request types have a body (e.g. GET usually doesn't)
if(requestBody != null && requestBody.length > 0)
{
conn.setDoOutput(true);
conn.setFixedLengthStreamingMode(requestBody.length);
conn.getOutputStream().write(requestBody);
conn.getOutputStream().flush();
conn.getOutputStream().close();
}
唯一の実際の変更は、呼び出しの順序を切り替えることであり、それによって例外が取り除かれました。うまくいけば、この問題を抱えていた他の人の問題が解決します。