最近在做接口方面的开发,需要程序主动发送http请求,之前在.net中使用的httpclient,java中貌似java11才有的httpclient,因此项目中暂且用URLConnection对象来做发送请求对象。
URLConnection是表示Java应用程序和URL之间的连接的所有类的父类。该URLConnection的类提供API的通用网址和它的子类HttpURLConnection类提供HTTP特定功能的附加支持。
请注意,这两个类都是抽象的 - 这就意味着我们无法直接创建URLConnection和HttpURLConnection的新实例。相反,通过从URL对象打开连接来获取URLConnection的实例。
步骤3至6是可选的,步骤5和6是可互换的。
让我们根据这个序列探索URLConnection和HttpURLConnection类的API 。
在实际建立连接之前,我们可以配置影响客户端和服务器之间正在进行的通信的各个方面,例如超时,缓存,HTTP请求方法等。
该URLConnection的类提供了配置连接下面的方法:
请注意,应在建立连接之前调用这些方法。如果已建立连接,则某些方法会抛出IllegalStateException。
此外,子类HttpURLConnection提供了以下用于使用HTTP特定功能配置连接的方法
建立连接后,服务器将处理URL请求并发回包含元数据和实际内容的响应。元数据是key = value对的集合,称为标题字段。
标题字段显示有关服务器,状态代码,协议信息等的信息。实际内容可以是文本,HTML,图像等,具体取决于文档的类型。
所述的URLConnection类提供用于读取头字段下面的方法:
这些是读取任何标题字段的一般方法。对于一些经常访问的头字段,URLConnection类提供了更具体的方法:
子类HttpURLConnection提供了另一种方法:
请注意,读取头字段时,将隐式建立连接,而不调用connect()。
要关闭连接,请在InputStream或OutputStream对象上调用close()方法。这样做可以释放与URLConnection实例关联的网络资源。
下面是一个请求的列子:
import javax.net.ssl.*;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.Map;
/**
* @Author: bo zhang
* @Description:
* @Date:Create:in 2018-09-28 0:01
* @Modified By:暂无
*/
public class HttpRequest {
//忽略证书的认证
private static void SkipCertificateValidation() throws Exception {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}
/**
* 请求方式
*
* @param urlStr 接口请求链接
* @return get请求直接返回请求的流
* @throws Exception
*/
public static InputStream getRequestWithAuth(String urlStr, Map params) throws Exception {
SkipCertificateValidation();//https请求的时候跳过证书认证(得在创建con前面才有效)
URL url = new URL(urlStr);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setRequestMethod("GET");//注意这个get要大写
///// "GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE" 有这些方法
con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
//采用base auth验证方式
/*String authEncoded = Base64.getEncoder().encodeToString((authStr).getBytes());
con.setRequestProperty("Authorization", "Basic " + authEncoded); //这个是必须要加的*/
con.setDoInput(true);
if (con.getResponseCode() != 200) {
throw new RuntimeException("请求出错,状态码为:" + con.getResponseCode());
}
return con.getInputStream();
}
/**
* 请求方式
*
* @param urlStr 接口请求链接
* @return
* @throws Exception
*/
public static String postRequestWithAuth(String urlStr, Map params) throws Exception {
SkipCertificateValidation();//跳过证书认证
URL url = new URL(urlStr);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setDefaultUseCaches(false);//post请求不需要缓存
con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
/* String authStr = user + ":" + pass;
String authEncoded = Base64.getEncoder().encodeToString((authStr).getBytes());
con.setRequestProperty("Authorization", "Basic " + authEncoded);*/
//设置请求要加的参数
SetRequestValue(con.getOutputStream(),params);
con.setConnectTimeout(5000);
int code = con.getResponseCode();
if (code != 200) {
return "接口发生未处理异常,请求状态码:"+code;
//con.getErrorStream() 可获得出错后的 返回流
}
con.disconnect();//断开连接
return "请求成功!";
}
//将参数拼接起来
private static void SetRequestValue(OutputStream outputStream, Map params) throws IOException {
if (params != null && params.size() > 0) {
DataOutputStream out = new DataOutputStream(outputStream);
String requestString = "";
for (String key : params.keySet()) {
requestString += key.trim() + "=" + URLEncoder.encode(params.get(key).toString(), "UTF-8").trim() + "&";
}
System.out.println("原始长度:" + requestString);
System.out.println("需要的字符串:" + requestString.substring(0, requestString.length() - 1));
out.writeBytes(requestString);
out.flush();
out.close();
}
}
}