UrlConnection doPost Https请求 、编码设置
2016-04-20 22:33
681 查看
UrlConnection doPost Https请求 、编码设置
UrlConnection doPost方法
/** * 发送POST请求 * * @param url 请求地址url * @param params 需要发送的请求参数字符串 * @param connTimeout 连接超时时间(毫秒),如果为null则默认为180秒 * @param readTimeout 读取超时时间(毫秒),如果为null则默认为180秒 * @return 请求响应内容,如果为null则表示请求异常 */ public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接,根据url URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setRequestProperty("Content-Type", contentType == null? "application/json" : contentType); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 设置请求超时时间和读取超时时间 conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout); conn.setReadTimeout(readTimeout == null ? 180 : readTimeout); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(params); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) result += line; } catch (Exception e) { e.printStackTrace(); result = null; } //使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; }
设置请求和返回数据 utf-8 编码的 doPost 方法
定义请求数据utf-8编码 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8")); 定义返回数据 utf-8编码 in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
完整设置编码的doPost方法
/** * 发送POST请求 * * @param url 请求地址url * @param params 需要发送的请求参数字符串 * @param connTimeout 连接超时时间(毫秒),如果为null则默认为180秒 * @param readTimeout 读取超时时间(毫秒),如果为null则默认为180秒 * @return 请求响应内容,如果为null则表示请求异常 */ public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接,根据url URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setRequestProperty("Content-Type", contentType == null? "application/json" : contentType); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 设置请求超时时间和读取超时时间 conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout); conn.setReadTimeout(readTimeout == null ? 180 : readTimeout); // 获取URLConnection对象对应的输出流,设置utf-8编码 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8")); // 发送请求参数 out.print(params); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应,设置utf-8编码 in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); String line; while ((line = in.readLine()) != null) result += line; } catch (Exception e) { e.printStackTrace(); result = null; } //使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; }
兼容http请求和https请求的doPost方法
https请求绕过https验证具体见下方代码
import javax.net.ssl.*; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; /** * Created by DawnHeaven on 16-4-20. */ public class PostUtils { /** * 忽视证书HostName */ private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { public boolean verify(String s, SSLSession sslsession) { //System.out.println("WARNING: Hostname is not matched for cert."); return true; } }; /** * Ignore Certification */ private static TrustManager ignoreCertificationTrustManger = new X509TrustManager() { private X509Certificate[] certificates; public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException { if (this.certificates == null) { this.certificates = certificates; //System.out.println("init at checkClientTrusted"); } } public void checkServerTrusted(X509Certificate[] ax509certificate, String s) throws CertificateException { if (this.certificates == null) { this.certificates = ax509certificate; //System.out.println("init at checkServerTrusted"); } } public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } }; /** * 获取UrlConn */ public static URLConnection geneUrlConn(String urlstr) throws Exception { URL url = new URL(urlstr); if(urlstr.startsWith("https://")){ HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection(); // Prepare SSL Context TrustManager[] tm = { ignoreCertificationTrustManger }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); httpsConnection.setSSLSocketFactory(ssf); return httpsConnection; } else { return url.openConnection(); } } /** * 发送POST请求 * * @param url 请求地址url * @param params 需要发送的请求参数字符串 * @param connTimeout 连接超时时间(毫秒),如果为null则默认为30秒 * @param readTimeout 读取超时时间(毫秒),如果为null则默认为60秒 * @return 请求响应内容,如果为null则表示请求异常 */ public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { // URL realUrl = new URL(url); // 打开和URL之间的连接,根据url URLConnection conn = geneUrlConn(url); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setRequestProperty("Content-Type", contentType == null? "application/json" : contentType); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 设置请求超时时间和读取超时时间 conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout); conn.setReadTimeout(readTimeout == null ? 180 : readTimeout); // 获取URLConnection对象对应的输出流 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8")); // 发送请求参数 out.print(params); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); String line; while ((line = in.readLine()) != null) result += line; } catch (Exception e) { e.printStackTrace(); result = null; } //使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } }
相关文章推荐
- 三次握手、四次挥手过程
- HyperV 网络配置固定IP地址
- HTTP请求原理介绍
- 印刷喷码字符识别,数段字符识别:易拉罐底字符识别开发说明书
- 红盟过客提到的 CCIE 必读书籍
- Java TCP/IP Socket编程
- Http GET 接口回调
- 深入理解linux网络技术内幕读书笔记(一)--简介
- 视频网络协议
- 网络通信解析
- OkHttp深入学习(四)——0kio
- android-async-http byte字节数组上传文件
- Android网络分析和优化
- TCP,Socket,HTTP,TCP和UDP的区别
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误
- 网络:NSURLSession 下载进度
- TCP协议Nagle算法和Delayed ACK相互影响实例分析
- twisted下使用网络连接池
- bzoj4538 [Hnoi2016]网络