问候,
我正在开发一款Android应用,需要通过https打开一个网址(带有POST参数)并获得响应。
我有一个自签名证书的额外复杂性。我还需要接受cookies。
任何人都对从哪里开始有任何想法?
非常感谢,
答案 0 :(得分:17)
Android自带了apache commons http库。 设置https发布请求非常简单:
HttpPost post = new HttpPost("https://yourdomain.com/yourskript.xyz");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("postValue1", "my Value"));
nameValuePairs.add(new BasicNameValuePair("postValue2", "2nd Value"));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
String responseText = EntityUtils.toString(entity);
Android使用commons http库的4.x版本,因为4.0以下的所有版本都在其生命周期之外。
我无法确切地知道如何向HttpClient注册自签名证书,但mybe the commons http文档有帮助:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506
答案 1 :(得分:3)
我设法让所有这些都与cookie和未签名的https同步。
我在这里使用了代码:
http://masl.cis.gvsu.edu/2010/04/05/android-code-sample-asynchronous-http-connections/
并使用Brian Yarger的代码修改为未签名的https:
Self-signed SSL acceptance on Android
(将上面的代码添加到HttpConnection.java中run()的开头)
为了让cookie工作,我不得不修改一些代码(来自HttpConnection.java的POST片段):
case POST:
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new StringEntity(data));
httpPost.addHeader("Cookie", Cookie.getCookie());
response = httpClient.execute(httpPost);
Header[] headers=response.getAllHeaders();
for(int i=0;i<headers.length;i++){
if(headers[i].getName().equalsIgnoreCase("Set-Cookie")){
//Log.i("i",headers[i].getName()+"---"+headers[i].getValue());
Cookie.setCookie(headers[i].getValue());
break;
}
}
break;
非常感谢大家指点我的方向,