0

Je développe une application de connexion simple. Mais je suis coincé au point où je reçois FileNotFoundException lors de l'appel (ou la frappe) API en utilisant Android Asynctask. Le code d'état que j'ai obtenu après avoir appelé est également 400. Mais je ne comprends pas où j'ai mal tourné. Voici le code de l'API appelante de la méthode doInBackground de asynctask.FileNotFoundException lors de l'appel de l'API RESTFul à l'aide de AsyncTask

@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; 
     } 

P.S. : - getQuery() est la fonction qui va ajouter & encoder les paramètres d'URL.Et getResponseText() est la fonction qui lit la réponse qui vient du serveur. Juste pour info, le contrôle d'exécution entre dans le bloc catch après la ligne InputStream in = new BufferedInputStream(urlConnection.getInputStream());

De plus, si j'atteins cette URL particulière via Postman, j'obtiens 200 (HTTP OK) comme code de réponse.

C'est ce que les états du journal des erreurs:

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) 

Merci :-)

+0

Postez votre journal des erreurs. –

+0

@DevendraSingh posté ... –

+0

Assurez-vous d'abord que le serveur fonctionne correctement en utilisant [Postman] (https://www.getpostman.com) ou en utilisant ** CURL **. –

Répondre

0

Désolé pour la réponse tardive. Si vous en avez assez du code de débogage, essayez d'utiliser HttpClient au lieu de HttpURLConnection. Cela a fonctionné pour moi. Essayez juste ci-dessous le code, dans votre 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){ 

     } 

Ne pas oublier d'ajouter la dépendance ci-dessous dans votre niveau app build.gradle

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

Permettez-moi de savoir si cela a fonctionné!

P.S. : - convertInputStreamToString (inputStream) est la méthode Helper pour convertir des inputstream en String

Merci.

0

si vous exécutez sur localhost, puis utilisez 10.0.2.2:[portNumber] dans l'adresse.

+0

non ... je ne l'exécute pas sur un hôte local –

+0

urlConnection.connect(); connecter la connexion url. –

+0

cela aussi n'a pas fonctionné! –