带有基本身份验证的 HTTPS 连接结果为“未经授权”
我正在尝试按照以下方式从我的 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:[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
}
}
此 URL 在 WebView
中显示响应,但当我尝试通过 HttpClient
访问时显示未经授权的异常,如上所示
这是通过 Android/Java 访问 Basecamp API 的正确方法吗? 或者 请为我提供正确的方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
HttpClient 无法从 URI 获取登录信用。
你必须用指定的方法给他们。
如果您使用 HttpClient 4.x,请查看以下内容:
http://hc.apache.org/httpcomponents-client-ga /tutorial/html/authentication.html
但请注意,如果您不想在 HttpClient 上使用新版本(Android 使用 3.x 版本),您应该查看此处:< br>
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:
HttpClient 4.x:
注意: 您将需要来自 Apache 的新 HttpClient,此外您还必须重新排列顺序,即 jar 文件位于 Android 库之前。
The HttpClient can't take the login creditals from the URI.
You have to give them with specified methods.
If you use HttpClient 4.x have a look on this:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html
But notice if you don't want to use the new version on the HttpClient (Android uses version 3.x), you should look here:
http://hc.apache.org/httpclient-3.x/authentication.html
That was the theory, now we use them:
Basically we use HTTP, but if you want to use HTTPS, you have to edit the following assignment
new HttpHost("www.google.com", 80, "http")
intonew HttpHost("www.google.com", 443, "https")
.Furthermore you have to edit the host (www.google.com) for your concerns.
Notice: Only the full qualified domain name (FQDN) is needed not the full URI.
HttpClient 3.x:
HttpClient 4.x:
Attention: You will need the new HttpClient from Apache and additionally you must rearrange the order, that the jar-file is before the Android library.
最后我明白了如何粘合上面答案中显示的代码...
一件非常重要的事情应该如何安排您的库以及您将需要哪些库...
来自 在这里你会找到这个库。
要在 eclipse 中添加它们(Android sdk < 16 以下)...
要在 eclipse 中按顺序排列它们...
对于 Android sdk >= 16 以上,您必须将这些库放入“libs”文件夹中。
Finally I got it How to glue the code shown in above answer ...
One very important thing How your library should be arranged and which libraries you will required ...
From Here you will find this libraries.
To add them in eclipse (Below Android sdk < 16)...
To arrange them in order in eclipse ...
For above Android sdk >= 16 you will have to put these libraries into "libs" folder.
附录关于 CSchulz 的精彩且非常有用的答案:
在 http 客户端 4.3 中,此:
不再工作(ClientContext.AUTH_CACHE 已弃用)
使用:
并
参见 http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/ClientContext.html
和:
http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/HttpClientContext.html
Appendix on the brilliant and very helpfull answer of CSchulz:
in http client 4.3 this:
does not work anymore (ClientContext.AUTH_CACHE is deprecated)
use:
and
see http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/ClientContext.html
and:
http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/protocol/HttpClientContext.html
如果您喜欢使用其他答案中提到的 HttpClient 4.x,您也可以
使用 httpclientandroidlib。这是一个转换后的普通 HttpClient,没有 apache.commons
并支持 Android LogCat。
If you like to use the HttpClient 4.x as mentioned in the other answers you could also
use httpclientandroidlib. This is a converted stock HttpClient without apache.commons
and with Android LogCat support.