关于java以post方式请求https协议网站问题

J2EE 码拜 10年前 (2015-04-04) 3122次浏览 0个评论

网上找了很多种请求https协议的方法,差不多都是以下的形式:

public class HttpsUtil{

private static class TrustAnyTrustManager implements X509TrustManager {

		public void checkClientTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
		}

		public void checkServerTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
		}

		public X509Certificate[] getAcceptedIssuers() {
			return new X509Certificate[] {};
		}
}

private static class TrustAnyHostnameVerifier implements HostnameVerifier {
		public boolean verify(String hostname, SSLSession session) {
			return true;
		}
}


/**
* post方式请求服务器(https协议)
* @param url
*            请求地址
* @param content
*            参数
* @param charset
*            编码
* @return
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @throws IOException
*/
public static byte[] post(String url, String content, String charset)
			throws NoSuchAlgorithmException, KeyManagementException,
			IOException {
		SSLContext sc = SSLContext.getInstance("SSL");
		sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },
				new java.security.SecureRandom());

		URL console = new URL(url);
		HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
		conn.setSSLSocketFactory(sc.getSocketFactory());
		conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
		conn.connect();
		DataOutputStream out = new DataOutputStream(conn.getOutputStream());
		out.write(content.getBytes(charset));
		// 刷新、关闭
		out.flush();
		out.close();
		InputStream is = conn.getInputStream();
		if (is != null) {
			ByteArrayOutputStream outStream = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int len = 0;
			while ((len = is.read(buffer)) != -1) {
				outStream.write(buffer, 0, len);
			}
			is.close();
			return outStream.toByteArray();
		}
		return null;
}


}

但是,我用这种方法访问的时候,还是不行会报错:
[16:38:19.303] java.lang.IllegalArgumentException: protocol = https host = null

有好的方法?

关于java以post方式请求https协议网站问题
40分
试试SSLContext sc= SSLContext.getInstance(“SSL”, “SunJSSE”);
关于java以post方式请求https协议网站问题
引用 1 楼 fudongrifdr 的回复:

试试SSLContext sc= SSLContext.getInstance(“SSL”, “SunJSSE”);

还是不行,同样的错误

关于java以post方式请求https协议网站问题
哪一行报的错?
关于java以post方式请求https协议网站问题
引用 3 楼 fudongrifdr 的回复:

哪一行报的错?

报的是这一行 conn.connect();

关于java以post方式请求https协议网站问题
引用 3 楼 fudongrifdr 的回复:

哪一行报的错?

这是错误信息关于java以post方式请求https协议网站问题

关于java以post方式请求https协议网站问题
注释掉conn.setHostnameVerifier(new TrustAnyHostnameVerifier());试试
关于java以post方式请求https协议网站问题
引用 6 楼 fudongrifdr 的回复:

注释掉conn.setHostnameVerifier(new TrustAnyHostnameVerifier());试试

  注释掉,还是一样的错误你是用什么方法访问https的?

关于java以post方式请求https协议网站问题
请求的地址错了,https;后面少了俩斜杠。。。加上后就可以了。。。自己太大意了。。
关于java以post方式请求https协议网站问题
你好,我在做https请求的时候用了一下阁下的代码,在代码中报错,错误是:cannot write to a URLConnection if doOutput=false – call setDoOutput(true)。然后我加上了以下两句代码就可以了,
        // 发送POST请求设置如下两行
        conn.setDoOutput(true);
        conn.setDoInput(true);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于java以post方式请求https协议网站问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!