一、http请求方法
1、直接上代码,如下
/**
*
* 处理http请求
* requestUrl 请求地址
* requestMethod 请求方式,值为"GET"或"POST"
* outputStr 请求参数
*
**/
public static String httpRequest(String requestUrl,
String requestMethod, String outputStr){
StringBuffer buffer = null;
try{
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true); // 设置可写
conn.setDoInput(true); // 设置可读
conn.setRequestMethod(requestMethod); // 请求方法
conn.connect();
// 往服务器端写内容 也就是发起http请求需要带的参数
if(outputStr != null){
OutputStream os = conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
// 读取服务器端返回的内容
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"utf-8"); // 将字节流转字符流
BufferedReader br = new BufferedReader(isr); // 写缓冲区
buffer = new StringBuffer();
String line = null;
while((line = br.readLine()) != null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
2、测试
public static void main(String[] args){
// 请求的url必须带上http
String s = httpRequest("http://www.baidu.com","GET",null);
System.out.println(s);
}
3、说明
1).第一个参数url需要写全地址,即前边的http必须写上,不能只写www.qq.com这样的。
2).第二个参数是请求方式,一般接口调用会给出URL和请求方式说明。
3).第三个参数是我们在发起请求的时候传递参数到所要请求的服务器,要传递的参数也要看接口文档确定格式,一般是封装成json或xml.
4).返回内容是String类,但是一般是有格式的json或者xml。
二、https请求
https是对链接加了安全证书SSL的,如果服务器中没有相关链接的SSL证书,它就不能够信任那个链接,也就不会访问到了;所以我们第一步是自定义一个信任管理器。自要实现自带的X509TrustManager接口就可以了。
代码如下:
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
*
* 自定义证书管理器
*
**/
public class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
备注:可以看到里面的方法都是空的,当方法为空是默认为所有的链接都为安全,也就是所有的链接都能够访问到。当然这样有一定的安全风险,可以根据实际需要写入内容。
https请求代码
/*
* 处理https GET/POST请求
* 请求地址、请求方法、参数
*
* */
public static String httpsRequest(String requestUrl,
String requestMethod, String outputStr){
StringBuffer buffer = ull;
try{
// 创建SSLContext
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManager[] tm = {new MyX509TrustManager()};
// 初始化
sslContext.init(null, tm, new java.security.SecureRandom());;
// 获取SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false); // 禁止缓存
conn.setRequestMethod(requestMethod); // 请求方式GET/POST
// 直接通过主机认证
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
// 激活主机认证
HttpsURLConnection.setDefaultHostnameVerifier(hv);
// 设置当前实例使用的SSLSoctetFactory
conn.setSSLSocketFactory(ssf);
conn.connect();
// 往服务器端写内容
if(outputStr != null ){
OutputStream os = conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
//读取服务器端返回的内容
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"utf-8");
BufferedReader br = new BufferedReader(isr);
buffer = new StringBuffer();
String line = null;
while((line = br.readLine()) != null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}