最近在调http接口,那天同事小哥突然跑过来跟我说,到时候线上的接口地址都是https的哦,你要不要准备两套代码。我???(((φ(◎ロ◎;)φ)))有什么不一样嘛???
我只晓得https协议加了个证书,对传输的数据进行了加密,但是我以前调了那么多接口都是https地址的,也是一套代码啊。后来老大跟我说,httpClient已经封装的很好了,http和https地址都是同时支持的,除非那种用自己私有证书的,比如12306那种,你打开网页的时候就让你下个证书的网站,才需要特殊处理。━((*′д`)爻才发现以前自己根本没注意过这个问题,所以就把httpClient的基本方法重新写了一遍,可以适合大部分的请求。至于http和https的区别以及https的特殊处理或者说两者的原理区分,以后再写(其实,我再毕业那年面试的时候就被问过这个问题,然而我到现在还是喵喵喵???)。
使用的包
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
一个简单的httpClient实例
public class SimpleClient {
/**
* 普通get请求
* http https 通用
*
* @param url
* @return
*/
public static String doSimpleGet(String url) {
//httpClient 4.0新写法
CloseableHttpClient httpclient = HttpClients.createDefault();
// 设置代理服务器地址和端口
HttpGet httpGet = new HttpGet(url);
//超时设置
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000) //设置连接超时时间,单位毫秒。
.setConnectionRequestTimeout(1000) //设置从connect Manager获取Connection 超时时间,单位毫秒。 从httpClient连接池获取httpClient
.setSocketTimeout(5000) //请求获取数据的超时时间,单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。
.build();
httpGet.setConfig(requestConfig);
CloseableHttpResponse response = null;
String rst = null;
try {
response = httpclient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();/** 返回状态 **/
if (statusCode == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
rst = EntityUtils.toString(entity, HTTP.UTF_8);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return rst;
}
/**
* @param url
* @param params 参数 ?a1=123&a2=321
* @return
*/
public static String doParamsGet(String url, Map<String, String> params) {
CloseableHttpClient httpclient = HttpClients.createDefault();
//创建一个uri对象
URIBuilder uriBuilder = null;
CloseableHttpResponse response = null;
String rst = null;
try {
uriBuilder = new URIBuilder(url);
for (Map.Entry<String, String> entry : params.entrySet()) {
uriBuilder.addParameter(entry.getKey(), entry.getValue());
}
HttpGet httpGet = new HttpGet(uriBuilder.build());
response = httpclient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();/** 返回状态 **/
if (statusCode == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
rst = EntityUtils.toString(entity, HTTP.UTF_8);
}
}
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return rst;
}
/**
* 普通post请求
* 直接post json
*
* @param url
* @param json
* @return
*/
public static String doPostJson(String url, String json) {
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String rst = null;
// 请求地址
HttpPost httpPost = new HttpPost(url);
//post请求
try {
httpPost.addHeader("Content-type", "application/json; charset=utf-8");
httpPost.setHeader("Accept", "application/json");
httpPost.setEntity(new StringEntity(json, Charset.forName("UTF-8")));
response = httpclient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
rst = EntityUtils.toString(entity, HTTP.UTF_8);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return rst;
}
/**
* post 表单
*x-www-form-urlencoded
* @param url
* @param params
* @return
*/
public static String doPostForm(String url, Map<String, Object> params) {
String rst = null;
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
try {
// 请求地址
HttpPost httpPost = new HttpPost(url);
List<BasicNameValuePair> formParams = new ArrayList<BasicNameValuePair>();
for (Map.Entry<String, Object> entry : params.entrySet()) {
formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
}
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(formParams, "UTF-8");
httpPost.setEntity(urlEncodedFormEntity);
//x-www-form-urlencoded
//urlEncodedFormEntity.getContentType()
response = httpclient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
rst = EntityUtils.toString(entity, HTTP.UTF_8);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return rst;
}
}
可以上传和下载文件的httpClient
public class MultiClient {
/**
* 上传文件
*
* @param url
* @param fileName
* @return
*/
public static String uploadFile(String url, String fileName) {
String rst = null;
CloseableHttpClient httpclient = HttpClients.createDefault();
File file = new File(fileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("mFile", file, ContentType.DEFAULT_BINARY, fileName);
builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
HttpPost post = new HttpPost(url);
HttpEntity entity = builder.build();
post.setEntity(entity);
try {
HttpResponse response = httpclient.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("<<<<<<<<<code<<<<<" + statusCode);
if (statusCode == HttpStatus.SC_OK) {
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
rst = EntityUtils.toString(responseEntity, HTTP.UTF_8);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return rst;
}
/**
* 下载文件
*
* @param url
*/
public static void downloadFile(String url, String fileName) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url + "?fileName=" + fileName);
CloseableHttpResponse response = null;
BufferedOutputStream out = null;
try {
response = httpclient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
byte[] rsts = EntityUtils.toByteArray(entity);
File file = new File("d:/tmp/downloadFile");
if (!file.exists()) {
file.createNewFile();
}
out = new BufferedOutputStream(new FileOutputStream(file));
out.write(rsts);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (httpclient != null) {
httpclient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
以上http请求适用的接口
@RestController
@RequestMapping("/http")
@Slf4j
public class HttpController {
@RequestMapping(value = "/getParam", method = RequestMethod.GET)
public String getParam(@RequestParam String data, @RequestParam Integer code) {
return data + "-new";
}
@RequestMapping(value = "/postJson", method = RequestMethod.POST)
public Book postJson(@RequestBody Book book) {
book.setName("new-" + book.getName());
book.setNum(book.getNum() + 1);
return book;
}
@RequestMapping(value = "/postForm", method = RequestMethod.POST)
public String postForm(@RequestParam String data, @RequestParam Integer code) {
return data + code;
}
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String uploadFile(@RequestParam("mFile") MultipartFile mFile, @RequestParam("text") String text) {
String content = null;
try {
byte[] buffer = mFile.getBytes();
content = new String(buffer, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return content + "\n" + text;
}
@RequestMapping(value = "/downloadFile", method = RequestMethod.GET)
public void downloadFile(@RequestParam String fileName, HttpServletResponse response) {
File file = new File("d:/" + fileName + ".png");
response.setContentType("image/png");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Access-Control-Allow-Origin", "*");
ServletOutputStream out = null;
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(file));
out = response.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
后续还要写个需要登陆的httpClient
网友评论