getInputStream 在 Android 的 Http Digest 身份验证期间给出 FileNotFoundException
Posted
技术标签:
【中文标题】getInputStream 在 Android 的 Http Digest 身份验证期间给出 FileNotFoundException【英文标题】:getInputStream gives FileNotFoundException during Http Digest Authentication in Android 【发布时间】:2013-04-25 07:03:07 【问题描述】:我正在尝试向具有 HTTP Digest 身份验证的 URL 发送 POST 请求。
我正在使用this 作为摘要。我可以理解,在这个机制中有两个步骤。在第一步中,客户端发送请求,服务器以质询响应。在第二步中,客户端将挑战合并到请求中并从服务器获取响应。使用上面提到的类,那件事可以正常工作。
我必须将 HttpConnection 更改为 HttpURLConnection 才能使其在 android 中运行。
现在,我有了 DataConnection 类,它使用 Digest Auth 类来完成工作。类如下:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONObject;
import android.content.ContentResolver;
import android.os.Build;
import android.util.Log;
public class DataConnection
private static DataConnection instance = null;
DigestAuthHandler dah = new DigestAuthHandler("mytestusername",
"myencryptedtestpassword");
public static DataConnection getInstance() throws IOException
if (instance == null)
instance = new DataConnection();
return instance;
public HttpURLConnection getHttpConnection(String request_url)
throws Exception
HttpURLConnection conn = (HttpURLConnection) new URL(request_url)
.openConnection();
conn.setAllowUserInteraction(false);
conn.setInstanceFollowRedirects(true);
conn.setChunkedStreamingMode(0);
conn.setRequestProperty("User-Agent", System.getProperty("http.agent"));
conn.setRequestProperty("Content-type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("Accept",
"application/json,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
conn.setRequestProperty("Accept-Charset", "UTF-8;q=0.7,*;q=0.7");
conn.setRequestProperty("Pragma", "no-cache");
conn.setRequestProperty("Cache-Control", "no-cache");
// if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO)
// System.setProperty("http.keepAlive", "false");
return conn;
public String sendPost(String request_url, byte[] data) throws Exception
HttpURLConnection connection = null;
InputStream is = null;
OutputStream os = null;
String responseData = "";
boolean reconnect = true;
while (reconnect)
try
connection = getHttpConnection(request_url);
dah.prepareHeaders(connection,
request_url.substring(request_url.indexOf('/', 8)));
connection.setRequestProperty("Content-Length", data.length
+ "");
connection.setDoOutput(true); // POST Method.
connection.connect();
if (connection != null)
os = connection.getOutputStream();
os.write(data);
os.flush();
reconnect = dah.processHeaders(connection);
int responseCode = connection.getResponseCode();
String responseMessage = connection.getResponseMessage();
is = connection.getInputStream();
int responseLength = (int) connection.getContentLength();
if (responseLength != -1)
byte[] incomingData = new byte[responseLength];
is.read(incomingData);
responseData = new String(incomingData);
else
ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
int ch;
while ((ch = is.read()) != -1)
bytestream.write(ch);
responseData = new String(bytestream.toByteArray());
bytestream.close();
catch (Exception exception)
throw exception;
finally
if (connection != null)
connection.disconnect();
if (os != null)
os.close();
if (is != null)
is.close();
try
JSONObject responseJson = new JSONObject(responseData);
Integer status = (Integer) responseJson.get("status");
int val = status.intValue();
if (val == 999999)
Log.e("Error 99999",
"Client application must be upgraded.");
catch (Exception e)
e.printStackTrace();
return responseData;
在这里,我在 getInputStream()
方法调用期间得到了 URL 的 FileNotFoundException
。我已经多次验证我请求的 URL 和 Digest Auth 的凭据是 100% 正确的。
请帮忙。
问候。
【问题讨论】:
【参考方案1】:通过检查空白连接解决了上述问题。问题是,连接是空白的,但我试图调用 connection.getInputStream() 因此它给出了错误。
【讨论】:
如果您可以发布您的代码n-p 以显示您如何检查空白连接,这将对其他用户有用。我假设您没有通过if(con == null)
完成此操作;)您能否将您的答案标记为“正确答案”?以上是关于getInputStream 在 Android 的 Http Digest 身份验证期间给出 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
Android HttpUrlConnection getInputStream 抛出 NullPointerException
带有 URLConnection 和 getInputStream 的 IOException
文件上传 servlet 从HttpServletRequest.getInputStream()中获得消息内容
ObjectInputStream(socket.getInputStream());不工作