FileNotFoundException при вызове API RESTFul с использованием AsyncTask

Я разрабатываю простое приложение для входа. Но я застрял в точке, где я получаю FileNotFoundException после вызова (или удара) API с помощью Android Asynctask, Также код состояния, который я получил после звонка, - 400. Но я не понимаю, где я ошибся. Ниже приведен код вызова API из метода asInctask doInBackground.

@Override
    protected JSONObject doInBackground(String... params) {
        HttpURLConnection urlConnection = null;
        BufferedWriter writer = null;
        OutputStream out = null;
        try
        {
            String email = params[0];
            String password = params[1];


            URL url = new URL("http://192.168.1.67:8080/eye/api/login");

            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(10000);
            urlConnection.setReadTimeout(10000);
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);
            urlConnection.setRequestMethod("POST");
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            urlConnection.setRequestProperty("Accept", "application/json");


            List<NameValuePair> loginCredentials = new ArrayList<>();

            loginCredentials.add(new BasicNameValuePair("username", email));
            loginCredentials.add(new BasicNameValuePair("password", password));

            out = urlConnection.getOutputStream();
            writer = new BufferedWriter(
                    new OutputStreamWriter(out, "UTF-8"));
            writer.write(getQuery(loginCredentials));
            writer.flush();

            int statusCode = urlConnection.getResponseCode();
            if (statusCode != HttpURLConnection.HTTP_OK)
            {
                Log.d("LoginActivity", "Connection failed: StatusCode: " + statusCode);
            }
            else
            {
                Log.d("LoginActivity", "Connection Success: StatusCode: " + statusCode);
            }

            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            responseText = getResponseText(in);
            return new JSONObject(responseText);
          }
            catch (Exception e)
          {
            e.printStackTrace();
          }
           return null;
       }

PS:- getQuery() - это функция, которая будет добавлять и кодировать параметры URL. А getResponseText() - это функция, которая читает ответ, полученный от сервера. Просто FYI, контроль выполнения входит в блок catch после строки InputStream in = new BufferedInputStream(urlConnection.getInputStream());

Кроме того, если я нажму этот конкретный URL через Почтальона, я получу 200(HTTP OK) в качестве кода ответа.

Вот что сообщает журнал ошибок:

12-15 16:24:07.028  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ java.io.FileNotFoundException: http://192.168.1.67:8080/eye/api/login
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:206)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at krixi.com.spanpumploginhit.Login$AsyncCheckLogin.doInBackground(Login.java:213)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at krixi.com.spanpumploginhit.Login$AsyncCheckLogin.doInBackground(Login.java:153)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-15 16:24:07.029  26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

Спасибо:-)

2 ответа

Если вы работаете на localhost, используйте адрес 10.0.2.2:[portNumber].

Извините за столь поздний ответ. Если вам надоела отладка приведенного выше кода, попробуйте использовать HttpClient вместо HttpURLConnection, Это сработало для меня. Просто попробуйте код ниже, в вашем doInBackground().

        String email = params[0];
        String password = params[1];
        InputStream inputStream = null;
        String result = "";

        try {
            // 1. create HttpClient

            HttpClient httpclient = new DefaultHttpClient();

            // 2. make POST request to the given URL
            HttpPost httpPost = new HttpPost("http://192.168.1.67:8080/eye/api/login");

            String json = "";

            // 3. build jsonObject
            JSONObject jsonObject = new JSONObject();
            jsonObject.accumulate("username", email);
            jsonObject.accumulate("password", password);

            // 4. convert JSONObject to JSON to String
            json = jsonObject.toString();



            // 5. set json to StringEntity
            StringEntity se = new StringEntity(json);

            // 6. set httpPost Entity
            httpPost.setEntity(se);

            // 7. Set some headers to inform server about the type of the content
            httpPost.setHeader("Content-type", "application/json");

            // 8. Execute POST request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpPost);

            // 9. receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // 10. convert inputstream to string
            if (inputStream != null)
                result = convertInputStreamToString(inputStream);
            else
                result = "Did not work!";


        }catch (Exception e){

        }

Не забудьте добавить ниже зависимости в уровне вашего приложения build.gradle

compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1'

Дайте мне знать, если это сработало!

PS:- convertInputStreamToString(inputStream) - это вспомогательный метод для преобразования inputtream в String

Спасибо.