请教httpclient访问https,我的步骤错哪里了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教httpclient访问https,我的步骤错哪里了相关的知识,希望对你有一定的参考价值。
参考技术A /*** 发起https请求并获取结果
*
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)
* @param outputStr
* 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpRequest(String requestUrl,
String requestMethod, String outputStr)
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = new MyX509TrustManager() ;
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url
.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod))
httpUrlConn.connect();
// 当有数据需要提交时
if (null != outputStr)
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null)
buffer.append(str);
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
catch (ConnectException ce)
log.error("Weixin server connection timed out.");
catch (Exception e)
log.error("https request error:", e);
return jsonObject;
本回答被提问者和网友采纳
Android HttpClient 和 HTTPS
【中文标题】Android HttpClient 和 HTTPS【英文标题】:Android HttpClient and HTTPS 【发布时间】:2010-04-08 21:47:54 【问题描述】:我是在 Android 中实现 HTTPS 连接的新手。本质上,我正在尝试使用 org.apache.http.client.HttpClient 连接到服务器。我相信,在某些时候,我需要访问应用程序的密钥库才能使用私钥授权我的客户端。但是,就目前而言,我只是想建立联系,看看会发生什么;我不断收到 HTTP/1.1 400 Bad Request 错误。
尽管有很多例子(它们似乎都不适合我),但我似乎无法对此做出正面或反面。我的代码看起来像这样(BODY 常量是 XmlRPC):
private void connect() throws IOException, URISyntaxException
HttpPost post = new HttpPost(new URI(PROD_URL));
HttpClient client = new DefaultHttpClient();
post.setEntity(new StringEntity(BODY));
HttpResponse result = client.execute(post);
Log.d("MainActivity", result.getStatusLine().toString());
所以,很简单。让我知道是否有人有任何建议。谢谢!
【问题讨论】:
【参考方案1】:这应该可以帮助您入门。我用的基本一样,除了ThreadSafeClientConnManager
。
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("https",
SSLSocketFactory.getSocketFactory(), 443));
HttpParams params = new BasicHttpParams();
SingleClientConnManager mgr = new SingleClientConnManager(params, schemeRegistry);
HttpClient client = new DefaultHttpClient(mgr, params);
【讨论】:
感谢您的快速回复。实际上,我之前尝试过类似的方法,但没有运气。同样的错误请求错误。 那么问题不在于 HTTPS,而在于其他问题。我粘贴的代码对我有用。 只是为了澄清:看起来您使用的是 org.apache.http.conn.ssl.SSLSocketFactory ,它与 javax.net.ssl.SSLSocketFactory 不同。对吗? @synic hi synic 如果您知道我们如何使用信任库流程验证密钥库,请告诉我..这可能对我有帮助..提前谢谢... @Dalbergia 是的,它是 org.apache.http.conn.ssl.SSLSocketFactory(我不得不皱起眉头很久才意识到)。以上是关于请教httpclient访问https,我的步骤错哪里了的主要内容,如果未能解决你的问题,请参考以下文章
用java做一个httpClient 发送https 的get请求,需要证书验证的那种,求大神指点一下!
httpclient信任所有证书解决SSLException:Unrecognized SSL message,plaintext connection