getInputStream выдает FileNotFoundException во время аутентификации дайджеста Http в Android

Я пытаюсь отправить запрос POST на URL-адрес, имеющий проверку подлинности дайджеста HTTP.

Я использую это для дайджеста. Я могу понять, что в этом механизме есть 2 шага. На первом этапе клиент отправляет запрос, а сервер отвечает запросом. На втором этапе клиент включает запрос в запрос и получает ответ от сервера. Эта вещь работает правильно, используя вышеупомянутый класс.

Мне пришлось изменить 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;
    }
}

Здесь я получаю FileNotFoundException для URL во время getInputStream() вызов метода. Я много раз проверял, что запрашиваемый URL-адрес и учетные данные для дайджест-аутентификации верны на 100%.

Пожалуйста помоги.

С уважением.

1 ответ

Вышеуказанная проблема была решена путем проверки отсутствия соединения. Проблема была в том, что соединение было пустым, но я пытался вызвать connection.getInputStream(), следовательно, это дало ошибку.

Другие вопросы по тегам