2012-08-09 15 views
11

errore di autenticazione: in grado di rispondere a qualsiasi di queste sfide: {} Android - 401 non autorizzatoErrore di autenticazione: in grado di rispondere a qualsiasi di queste sfide: {} Android - 401 non autorizzato

ho preso di riferimento da questo link Authentication Error when using HttpPost with DefaultHttpClient on Android

Sto lavorando all'app per Android in quella supportata in Drupal. In questo sto inviando dati dall'app Android al sito Web di drupal - webservice in formato JSON. Ora posso leggere i dati JSON dal webservice di Drupal e scriverlo nella mia applicazione Android. Ma di fronte a problema per iscritto su Drupal da Android, genera la risposta con codice di stato

401 Unauthorized

Da app nativa Android genera 401, mentre da PhoneGap-da Android quando avvio la procedura richiesta AJAX funziona perfettamente & scrive un articolo o pagina sul sito di drupal. in modo che significa lavoro webservice perfettamente &

my phonegap android app works perfectly there is problem with Android native JAVA application I am running my android application on Android2.3.4 -> Samsung Galaxy S Plus - Samsung GT-I9001

qui è il mio codice per Java Android.

==============================

String url = "XXX"; 
strResponse1 = makeWebForPostIdea(url,title,body); 

public static String makeWebForPostIdea(String url, String title,String body) 
    { 
     JSONStringer jsonobject = null; 
     JSONObject json = null; 
     JSONObject jsonnode = null; 

     DefaultHttpClient client = new DefaultHttpClient(); 

Credentials creds = new UsernamePasswordCredentials("username", "password"); 
     client.getCredentialsProvider().setCredentials(new  AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), creds); 
HttpPost post = new HttpPost(url); 
System.out.println("value of the post =============> "+post); 
try { 
      JSONObject jsonvalue = new JSONObject(); 
      jsonvalue.put("value", body.toString()); 

      JSONArray array = new JSONArray(); 
      array.put(jsonvalue); 

      jsonnode = new JSONObject(); 
      jsonnode.put("und", array); 

      System.out.println("@@@@@@2 jsonnode=======>"+jsonnode.toString()); 


     } catch (JSONException e3) { 
      // TODO Auto-generated catch block 
      e3.printStackTrace(); 
     } 
try { 
jsonobject = new JSONStringer().array().object().key("und").object().key("0").object().key("value").value(body).endObject().endObject().endObject().endArray(); 
    System.out.println("=============>"+jsonobject); 

     } catch (JSONException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 

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

       params.add(new BasicNameValuePair("type","page")); 

      params.add(new BasicNameValuePair("title",title)); 
      params.add(new BasicNameValuePair("language","und")); 
      params.add(new BasicNameValuePair("body",jsonobject.toString())); 

      System.out.println("value of the params =============> "+params); 

     UrlEncodedFormEntity formEntity = null; 
     try { 
       formEntity = new UrlEncodedFormEntity(params); 
     } catch (UnsupportedEncodingException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     post.setEntity(formEntity); 

     try { 

      HttpResponse response = client.execute(post); 

      int statusCode = response.getStatusLine().getStatusCode(); 
      System.out.println("=========> statusCode post idea=====> "+statusCode);  
      if (statusCode == HttpStatus.SC_OK) 
      { 
       HttpEntity entity = response.getEntity(); 
       InputStream is = entity.getContent(); 
       return iStream_to_String(is); 
      } 
      else 
      { 
       return "Hello This is status ==> :"+String.valueOf(statusCode); 
      } 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public static String iStream_to_String(InputStream is1) { 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is1), 4096); 
      String line; 
      StringBuilder sb = new StringBuilder(); 
      try { 
       while ((line = rd.readLine()) != null) { 
        sb.append(line); 
       } 
       rd.close(); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     String contentOfMyInputStream = sb.toString(); 
     return contentOfMyInputStream; 
      } 

    } 

    } 

Ecco l'logcat che sto ottenendo.

08-09 12:41:29.063: I/System.out(336): value of the post =============>  [email protected] 
08-09 12:41:29.093: I/System.out(336): @@@@@@2 jsonnode=======>{"und": [{"value":"ddddddd"}]} 
08-09 12:41:29.093: I/System.out(336): =============>[{"und":{"0":{"value":"ddddddd"}}}] 
08-09 12:41:29.103: I/System.out(336): value of the params =============> [type=page, title=hhhh, language=und, body=[{"und":{"0":{"value":"ddddddd"}}}]] 
08-09 12:41:30.913: W/DefaultRequestDirector(336): Authentication error: Unable to respond to any of these challenges: {} 
08-09 12:41:30.913: I/System.out(336): =========> statusCode post idea=====> 401 
08-09 12:41:30.924: I/System.out(336): =========> Response from post idea => Hello This is status ==> :401 

Ecco la richiesta di PhoneGap Ajax funziona perfettamente.

$('#page_node_create_submit').live('click',function(){ 

    var title = $('#page_node_title').val(); 
    //if (!title) { alert('Please enter a title.'); return false; } 

    var body = $('#page_node_body').val(); 
    //if (!body) { alert('Please enter a body.'); return false; } 

    // BEGIN: drupal services node create login (warning: don't use https if you don't  have ssl setup) 
    $.ajax({ 
     url: "XXX", 
     type: 'post', 
     data: 'node[type]=page&node[title]=' + encodeURIComponent(title) + '&node[language]=und&node[body][und][0][value]=' + encodeURIComponent(body), 
     dataType: 'json', 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
     alert('page_node_create_submit - failed to login'); 
     console.log(JSON.stringify(XMLHttpRequest)); 
     console.log(JSON.stringify(textStatus)); 
     console.log(JSON.stringify(errorThrown)); 
     }, 
     success: function (data) { 
     $.mobile.changePage("index.html", "slideup"); 
    } 
    }); 
    // END: drupal services node create 

    return false; 

}); 

=========================================== ======================================

Edit:

ho Ho provato vari metodi per Apache httpclient per il mio errore.Durante questa volta ho fatto qualche ricerca e cercato su google e ho scoperto alcune cose interessanti.

prima cosa che ho trovato che Android-Google Ufficialmente sconsiglia Apache HttpClient che sto utilizzando nel mio codice. Controlla questo link. In quel messaggio Link di Jesse Wilson del team Dalvik. In questo suggeriscono di usare HttpURLConnection invece di DefaultHttpClient e anche di scrivere che il team Android non svilupperà più Apache httpclient. quindi è la versione precedente che sto usando.

http://android-developers.blogspot.in/2011/09/androids-http-clients.html

secondo cosa che ho trovato questo link modulo. Suggerisce che Android è in vendita con HttpClient 4.0 Beta2 di Apache, che ha un trabocchetto quando si tratta di autenticazione di base. Il metodo di autenticazione che sto utilizzando è HttpClient 3.x, che ho trovato da questo link. controllare il collegamento. http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

Quindi il problema della versione.

http://dlinsin.blogspot.in/2009/08/http-basic-authentication-with-android.html

Ho anche trovato alcuni collegamenti con la potenziale soluzione di questo problema.

http://ogrelab.ikratko.com/using-newer-version-of-httpclient-like-4-1-x/

Apache HttpClient 4.1 on Android

What version of Apache HTTP Client is bundled in Android 1.6?

da questi link, ho fatto una conclusione che se aggiorniamo l'Apache HttpClient all'ultima versione stabile, allora questo problema può essere risolto.

Ma questo non è direttamente possibile, in quanto Android Team ha ufficialmente interrotto il supporto per Apache httpclient.

Con questo collegamento Potrebbe essere possibile risolvere. Non l'ho provato ma ci sto lavorando.

È la libreria che può aiutare nell'aggiornamento della versione di httpclient in Android.

http://code.google.com/p/httpclientandroidlib/

L'altra soluzione potrebbe essere utilizzando HttpURLConnection .Sono inoltre lavorando su di esso.

ma la maggior parte persone qui su StackOverflow e Internet sembra usando DefaultHttpCLient con Android. E naturalmente funziona anche con me per tutta la mia applicazione, inclusi login, registrazione, lettura da server e sessione e altre funzionalità. Solo che non funziona con direttamente postare qualche articolo sul mio server-Drupal website. Funziona perfettamente con la richiesta POST durante la registrazione dell'utente sul server.

Quindi amici, qualche suggerimento a riguardo? perché non funziona solo con l'articolo di post?

+0

ho visto anche questa domanda http://stackoverflow.com/questions/10407547/error-http-1-1-401-unauthorized-with-basic-authentication-in-android-ews-201? rq = 1 e ho provato nel mio codice ... con il passaggio di nome utente e password, ma ancora non funziona. Ancora la stessa risposta -> 401 –

+0

Prova http: // StackOverflow.it/questions/8022800/problem-doing-ajax-requests-with-a-phonegap-application –

+0

@ChanchalShelar Non ho problemi con PhoneGap ... funziona perfettamente ... Ho problemi con l'applicazione Android Java. Quindi qui la mia domanda è: lo stesso server funziona con PhoneGap, quindi perché non funziona con Android. –

risposta

1

Si potrebbe provare a controllare: How to do http post using apache httpclient with web authentication?

Esso utilizza una HttpInterceptor per iniettare i dati di autenticazione, quando richiesto

+0

Lasciami provare. Quindi aggiornerò le informazioni qui. Grazie. –

+1

ciao, ho provato la soluzione con HttpRequestInterceptor citato in quel collegamento. Ma ora sto ricevendo questo errore "Errore di autenticazione: la richiesta di autorizzazione di base prevista, ma non trovata" ... qualsiasi soluzione su questo? –

2

Come mai funziona dal PhoneGap, ma non Java. PhoneGap esegue l'app in un contenitore Web e quindi è già stata autenticata e hai tutti i cookie giusti. AJAX condividerà la stessa sessione e tutto 'funziona'.

Tuttavia HTTPClient è completamente diverso: si avvia una nuova sessione HTTP e tutto deve essere corretto.

Alcuni commenti su come HTTP Auth funziona:

Ci sono diversi metodi di autenticazione HTTP - ed è il web server che sceglie quale. Prima di proseguire, controlla la configurazione di Drupal per capire se è:

(Si noti inoltre che il contenitore web ha la 'intelligenza' per essere in grado di provare diversi metodi di autenticazione, come richiesto dal server, il tutto dietro le quinte)

Controllare anche i web log Drupal. Alcune indicazioni:

  • Hai visto il HTTPClient collegare affatto. E l'URL sta andando alla risorsa corretta. Vale sempre la pena di verificare dal punto di vista del server ...
  • È andato al server giusto? Un esempio di cosa potrebbe andare storto: stai usando gli indirizzi IP nell'URL contro un server web multihomed, quindi la richiesta va al server sbagliato?
  • Verificare che l'autenticazione inviato dal client preventivamente sia del tipo corretto (di base, digest, NTLM)

fatemi sapere se questo aiuta. In caso contrario, e puoi fornire maggiori dettagli come da questo post, posso dare un ulteriore consiglio.

+0

Ciao Andrew Grazie per la risposta. Si prega di verificare la domanda che ho modificato. Ho cercato su Google e ho scoperto alcune cose interessanti. E sì, ho controllato il log del server, HttpClient si connette al server. –

+1

Grande. Ho letto queste risposte. La maggior parte dei problemi e degli errori sembrano essere relativi a Android 1.5 e 1.6 - si è su 2.3 che è molto meglio di queste altre versioni. Avete i log HTTP della richiesta visti dal server? Hai annusato la connessione e verificato che cosa esattamente stia andando storto, ad esempio utilizzando wireshark o Fiddler: http://stackoverflow.com/questions/4853094/best-way-to-analyze-http-traffic-sent-by-my- java-code –

+0

Questo è anche un articolo utile, anche se mirato per iOS: http://www.tuaw.com/2011/02/21/how-to-inspect-ioss-http-traffic-without-spending-a- dime/ –

1

Suggerisco di testare prima il lato PHP fuori dall'app. Esistono diversi modi per effettuare le proprie chiamate incluse intestazioni e autenticazione. Da curl a GraphicalHttpClient (http://itunes.apple.com/us/app/graphicalhttpclient/id433095876?mt=12, lo uso personalmente e funziona in modo decente). Esistono altre opzioni come REST client debugger (https://addons.mozilla.org/en-US/firefox/addon/restclient/)

In questo modo sarete in grado di testare la vostra chiamata in tanti modi che è il dolore che fa direttamente nel client (a volte cambia solo da http a https o aggiungi il tipo di token nell'intestazione Authorization e questo è molto più facile da fare al volo).

Una volta che tutto funziona come previsto, riprodurre la stessa chiamata, intestazioni e corpo nel client e si è pronti per andare.

+1

Presta particolare attenzione all'annidamento e agli array JSON. Alcuni servizi non supportano (o si aspettano) solo un tipo di richiesta. (es .: utilizzo di oggetti invece di matrici con nomi di proprietà di tipo array -> "provider [0]": "DHL", ecc.). –

+0

Ciao Jose, grazie per la risposta. Lato PHP sto usando drupal. Posso usare il plugin firefox per i poster per testare il mio servizio e l'oggetto o l'array JSON per la mia richiesta come suggerito. https://addons.mozilla.org/en-US/firefox/addon/poster/ Fammi provare e poi ti messaggio nuovamente. Grazie. –

1

Ero in esecuzione nello stesso "DefaultRequestDirector: errore di autenticazione: impossibile rispondere a una di queste sfide: {}" problema con i servizi Drupal che utilizzano lo loopj android-async-http library (lo consiglio vivamente).

La chiave per la soluzione per me è stata nel commento di Jose L Ugia in una delle risposte relative a prestare particolare attenzione all'output JSON di Drupal. Stavo cercando di catturare un oggetto JSONObject ma il vero messaggio era in formato array "[" Nome utente o password errati. "]". Passare a JSONArray ha colto l'errore correttamente e mi ha permesso di gestirlo. Nel tuo caso, credo che sia perché non stai inviando le credenziali di accesso come previsto dai servizi di Drupal.

Si dovrebbe ricordare con Drupal Servizi si dovrebbe fare sistema/collegare e afferrare la sessione, seguito da utente/login (e l'utente/password passato come parametri) e afferrare la sessione e poi tutte le vostre richieste successive dovrebbe funzionare. Questo è il motivo per cui mi piace usare la libreria loopj perché rende tutte queste richieste più gestibili. Ecco un esempio molto semplice di connessione a drupal con loopj. Tutti i post successivi sono fatti facilmente usando i parametri.

public class Loopj { 
    private static final String TAG = "loopj"; 

    private static AsyncHttpClient client = new AsyncHttpClient(); 
    private final PersistentCookieStore myCookieStore; 


    public Loopj(Context context) { 
    myCookieStore = new PersistentCookieStore(context); 
    client.setCookieStore(myCookieStore); 
    client.addHeader("Content-type", "application/json"); 
    } 


    public void systemConnect(String uri) throws JSONException { 
    client.post(uri + "/endpoint/system/connect", new JsonHttpResponseHandler() { 
     @Override 
     public void onSuccess(JSONObject json) { 
     Log.i("TAG", "Connect success =" + json.toString()); 
     } 

     @Override 
     public void onFailure(Throwable e, String response) { 
     Log.e("TAG", "Connect failure"); 
     } 
    }); 
    } 

    public void userLogin(String uri) throws JSONException { 
    RequestParams params = new RequestParams(); 
    params.put("username", username); 
    params.put("password", password); 
    client.post(uri + "/endpoint/user/login", params, new JsonHttpResponseHandler() { 
     @Override 
     public void onSuccess(JSONArray response) { 
     Log.i("TAG", "Login success =" + response.toString()); 
     } 

     @Override 
     public void onFailure(Throwable e, JSONArray json) { 
     Log.e("TAG", "Login failure"); 
     } 
    }); 
    } 
Problemi correlati