我试图从我的Android/Java源代码访问Basecamp API ....
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:password@projectsource.basecamphq.com/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()); ResponseHandlerres = 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 } }
此URL显示响应WebView
,但在我尝试访问时显示未授权的异常,HttpClient
如上所示.
这是通过Android/Java 访问Basecamp API的正确方法吗?或者请给我一个正确的方法.
该HttpClient的不能把从URI登录creditals.
你必须用指定的方法给它们.
如果你使用HttpClient 4.x看看这个:http:
//hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html
但请注意,如果您不想在HttpClient上使用新版本(Android使用版本3.x),请查看此处:http:
//hc.apache.org/httpclient-3.x/authentication.html
这是理论,现在我们使用它们:
基本上我们使用HTTP,但如果你想使用HTTPS,你必须编辑以下分配new HttpHost("www.google.com", 80, "http")
成new HttpHost("www.google.com", 443, "https")
.
此外,您必须编辑主机(www.google.com)以了解您的疑虑.
注意:只需要完整的合格域名(FQDN)而不是完整的URI.
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:
注意:您将需要新的HttpClient从Apache和另外你必须重新排列顺序,该JAR文件是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(); } } }