2011-08-18 16 views
6

sto cercando di accesso Basecamp API dal mio codice sorgente di Android/Java seguente modo ....HTTPS connessione con risultato di base autenticazione in non autorizzato

import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.os.Bundle; 
import android.webkit.WebView; 

public class BCActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 

     //final String url = "https://encrypted.google.com/webhp?hl=en"; //This url works 
     final String url = "https://username:[email protected]/people.xml"; //This don't 
     HttpGet http = new HttpGet(url); 
     http.addHeader("Accept", "application/xml"); 
     http.addHeader("Content-Type", "application/xml"); 

     try { 

      // HttpResponse response = httpClient.execute(httpPost); 
      HttpResponse response = httpClient.execute(http); 

      StatusLine statusLine = response.getStatusLine(); 
      System.out.println("statusLine : "+ statusLine.toString()); 

      ResponseHandler <String> res = new BasicResponseHandler(); 

      String strResponse = httpClient.execute(http, res); 
      System.out.println("________**_________________________\n"+strResponse); 
      System.out.println("\n________**_________________________\n"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     WebView myWebView = (WebView) this.findViewById(R.id.webView); 
     myWebView.loadUrl(url);//Here it works and displays XML response 

    } 
} 

Questo URL visualizza la risposta in WebView, ma mostra un'eccezione non autorizzato quando Provo ad accedere tramite HttpClient come mostrato sopra.

È questo il modo giusto per accedere a API Basecamp tramite Android/Java? o Per favore forniscimi il modo giusto per farlo.

risposta

10

Il HttpClient non può accettare i dati di accesso dall'URI.
Devi darli con metodi specificati.

Se si utilizza HttpClient 4.x hanno un'occhiata a questo:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html

a meno di notare se non si desidera utilizzare la nuova versione sul HttpClient (Android utilizza la versione 3. x), si dovrebbe guardare qui:
http://hc.apache.org/httpclient-3.x/authentication.html

Quella era la teoria, ora li usiamo:
Fondamentalmente w e utilizzare HTTP, ma se si desidera utilizzare HTTPS, è necessario modificare il seguente incarico new HttpHost("www.google.com", 80, "http") in new HttpHost("www.google.com", 443, "https").

Inoltre, è necessario modificare l'host (www.google.com) per i propri dubbi.
Avviso: È necessario solo il nome di dominio completo (FQDN) completo, non l'URI completo.

HttpClient 3.x:

package com.test; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpHost; 
import org.apache.http.HttpResponse; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.UsernamePasswordCredentials; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.util.EntityUtils; 
import android.app.Activity; 
import android.os.Bundle; 

public class Test2aActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     try { 
      HttpHost targetHost = new HttpHost("www.google.com", 80, "http"); 

      DefaultHttpClient httpclient = new DefaultHttpClient(); 
      try { 
       // Store the user login 
       httpclient.getCredentialsProvider().setCredentials(
         new AuthScope(targetHost.getHostName(), targetHost.getPort()), 
         new UsernamePasswordCredentials("user", "password")); 

       // Create request 
       // You can also use the full URI http://www.google.com/ 
       HttpGet httpget = new HttpGet("/"); 
       // Execute request 
       HttpResponse response = httpclient.execute(targetHost, httpget); 

       HttpEntity entity = response.getEntity(); 
       System.out.println(EntityUtils.toString(entity)); 
      } finally { 
       httpclient.getConnectionManager().shutdown(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

HttpClient 4.x:

Attenzione: Sarà necessario il nuovo HttpClient da Apache e inoltre è necessario riorganizzare l'ordine, che il file jar sia prima della libreria Android.

package com.test; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpHost; 
import org.apache.http.HttpResponse; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.UsernamePasswordCredentials; 
import org.apache.http.client.AuthCache; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.protocol.ClientContext; 
import org.apache.http.impl.auth.BasicScheme; 
import org.apache.http.impl.client.BasicAuthCache; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.protocol.BasicHttpContext; 
import org.apache.http.util.EntityUtils; 
import android.app.Activity; 
import android.os.Bundle; 

public class TestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     try { 
      HttpHost targetHost = new HttpHost("www.google.com", 80, "http"); 

      DefaultHttpClient httpclient = new DefaultHttpClient(); 
      try { 
       // Store the user login 
       httpclient.getCredentialsProvider().setCredentials(
         new AuthScope(targetHost.getHostName(), targetHost.getPort()), 
         new UsernamePasswordCredentials("user", "password")); 

       // Create AuthCache instance 
       AuthCache authCache = new BasicAuthCache(); 
       // Generate BASIC scheme object and add it to the local 
       // auth cache 
       BasicScheme basicAuth = new BasicScheme(); 
       authCache.put(targetHost, basicAuth); 

       // Add AuthCache to the execution context 
       BasicHttpContext localcontext = new BasicHttpContext(); 
       localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache); 

       // Create request 
       // You can also use the full URI http://www.google.com/ 
       HttpGet httpget = new HttpGet("/"); 
       // Execute request 
       HttpResponse response = httpclient.execute(targetHost, httpget, localcontext); 

       HttpEntity entity = response.getEntity(); 
       System.out.println(EntityUtils.toString(entity)); 
      } finally { 
       httpclient.getConnectionManager().shutdown(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Ho modificato la mia risposta. ;) – CSchulz

+0

Hai letto i miei commenti? Stai provando a usare * HttpClient * versione 4.xe hai bisogno delle librerie e ** cambia l'ordine delle librerie **! – CSchulz

+0

La libreria * HttpClient * deve trovarsi prima delle librerie Android. Non so quale IDE stai usando. In eclissi puoi farlo nelle * proprietà del progetto * -> * percorso di costruzione java * -> * ordine ed esportazione * – CSchulz

4

Finalmente ho capito come incollare il codice mostrato nella risposta precedente ...

public static void performPost(String getUri, String xml) { 

    String serverName = "*******"; 
    String username = "*******"; 
    String password = "********"; 
    String strResponse = null; 

    try { 
     HttpHost targetHost = new HttpHost(serverName, 443, "https"); 

     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     try { 
      // Store the user login 
      httpclient.getCredentialsProvider().setCredentials(
        new AuthScope(targetHost.getHostName(), targetHost.getPort()), 
        new UsernamePasswordCredentials(username, password)); 

      // Create AuthCache instance 
      AuthCache authCache = new BasicAuthCache(); 
      // Generate BASIC scheme object and add it to the local 
      // auth cache 
      BasicScheme basicAuth = new BasicScheme(); 
      authCache.put(targetHost, basicAuth); 

      // Add AuthCache to the execution context 
      BasicHttpContext localcontext = new BasicHttpContext(); 
      localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache); 

      // Create request 
      // You can also use the full URI http://www.google.com/ 
      HttpPost httppost = new HttpPost(getUri); 
      StringEntity se = new StringEntity(xml,HTTP.UTF_8); 
      se.setContentType("text/xml"); 
      httppost.setEntity(se); 
      // Execute request 
      HttpResponse response = httpclient.execute(targetHost, httppost, localcontext); 

      HttpEntity entity = response.getEntity(); 
      strResponse = EntityUtils.toString(entity); 

      StatusLine statusLine = response.getStatusLine(); 
      Log.i(TAG +": Post","statusLine : "+ statusLine.toString()); 
      Log.i(TAG +": Post","________**_________________________\n"+strResponse); 
      Log.i(TAG +": Post","\n________**_________________________\n"); 

     } finally { 
      httpclient.getConnectionManager().shutdown(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

Una cosa molto importante come la vostra biblioteca dovrebbe essere organizzato e quali librerie si richiesta ...

enter image description here

Da Here troverete questo biblioteche.

aggiungerli in Eclipse (Sotto Android SDK < 16) ...

Project properties -> java build path -> Libraries -> Add external JARs 

di disporli in ordine in Eclipse ...

Project properties -> java build path -> order and export 

Per sopra android sdk> = 16 dovrai mettere queste librerie nella cartella "libs".

+0

Viene visualizzato questo errore: AUTH_CACHE non può essere risolto o non è un campo – wwjdm

+0

@EliMiller Riordinare le librerie come specificato nella risposta. Colloca le librerie di riferimento sopra il jar Android. –

1

Se si desidera utilizzare HttpClient 4.x come accennato nelle altre risposte, è possibile utilizzare anche httpclientandroidlib. Questo è un HttpClient convertito in magazzino senza apache.commons e con supporto Android LogCat.

4

appendice sulla risposta brillante e molto utile di CSchulz:

client http 4.3 questo:

localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache); 

non funziona più (ClientContext.AUTH_CACHE è deprecato)

uso:

import org.apache.http.client.protocol.HttpClientContext; 

e

localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); 

vedere http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/ClientContext.html

e:

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/HttpClientContext.html

Problemi correlati