先介绍环境
SpirngBoot 2.3.7 == JAVA 1.8.241 == win10系统下开发 == IDEA 2020
使用依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
实现是很简单的主要是一些坑帮大家说明一下 如果没使用过 看看代码就能看懂 就不做过多解释直接上代码
调用的方法
/**
* 使用httpclint 发送文件
* @author: tc
* @date: 2021-09-23
* @param url 调用的连接
* parms 使用map装入需要调用的参数名与值
* @return 响应结果
*/
public static JSONObject doPostForm(String url, Map<String, String> parms) throws Exception {
HttpPost httpPost = new HttpPost(url);
ArrayList<BasicNameValuePair> list = new ArrayList<>();
parms.forEach((key, value) -> list.add(new BasicNameValuePair(key, value)));
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
if (Objects.nonNull(parms) && parms.size() >0) {
httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
}
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
JSONObject jsonObject = JSON.parseObject(EntityUtils.toString(entity, "UTF-8"));
return jsonObject;
}catch (IOException e) {
e.printStackTrace();
}finally {
if (Objects.nonNull(httpClient)){
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
如何调用
/**
* 如何调用
* @author: tc
* @date: 2021-09-23
* @param url
* @return 响应结果
*/
Map doget = new HashMap();
//key为参数名 value为值
doget.put("accessToken", accessToken);
doget.put("deviceSerial", deviceSerial);
//这里int类型要转String 如果参数是对象要转jsonString
doget.put("channelNo", String.valueOf(channelNo));
JSONObject jsonObject = HttpUtil.doPostForm("https://open.ys7.com/api/lapp/device/capture", doget);
其他如put get请求的调用方法
public static JSONObject doPutForm(String url, Map<String, String> parms) throws Exception {
HttpPut httpPut = new HttpPut(url);
ArrayList<BasicNameValuePair> list = new ArrayList<>();
parms.forEach((key, value) -> list.add(new BasicNameValuePair(key, value)));
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
if (Objects.nonNull(parms) && parms.size() >0) {
httpPut.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
}
InputStream content = httpPut.getEntity().getContent();
InputStreamReader inputStreamReader = new InputStreamReader(content, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String readLine = bufferedReader.readLine();
String s = URLDecoder.decode(readLine, "UTF-8");
HttpResponse response = httpClient.execute(httpPut);
HttpEntity entity = response.getEntity();
JSONObject jsonObject = JSON.parseObject(EntityUtils.toString(entity, "UTF-8"));
return jsonObject;
}catch (IOException e) {
e.printStackTrace();
}finally {
if (Objects.nonNull(httpClient)){
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public static JSONObject doGetForm(String url, Map<String, String> parms) throws Exception {
ArrayList<BasicNameValuePair> list = new ArrayList<>();
parms.forEach((key, value) -> list.add(new BasicNameValuePair(key, value)));
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
//3、转化参数
String params = EntityUtils.toString(new UrlEncodedFormEntity(list,Consts.UTF_8));
//4、创建HttpGet请求
HttpGet httpGet = new HttpGet(url+"?"+params);
CloseableHttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
JSONObject jsonObject = JSON.parseObject(EntityUtils.toString(entity, "UTF-8"));
return jsonObject;
}catch (IOException e) {
e.printStackTrace();
}finally {
if (Objects.nonNull(httpClient)){
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
由于业务需求会遇到调用第三方需要上传文件
第一步 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这里是方法
/**
* 使用httpclint 发送文件
* @author: tc
* @date: 2021-09-23
* @param file
* 上传的文件
* @return 响应结果
*/
public static JSONObject doPostUploadFile(String url ,MultipartFile file,String fileParamName,Map<String,String>otherParams) {
CloseableHttpClient httpClient = HttpClients.createDefault();
JSONObject obj=new JSONObject();
try {
HttpPost httpPost = new HttpPost(url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//当初踩坑了的写法 唉。。。。
// builder.setContentType(ContentType.MULTIPART_FORM_DATA);
// builder.addBinaryBody(fileParamName, file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);
//这是最终解决了的方法
builder.setMode(HttpMultipartMode.RFC6532);//加上此行代码解决返回中文乱码问题
//这里是添加文件
builder.addBinaryBody(fileParamName, file.getInputStream(),ContentType.MULTIPART_FORM_DATA,file.getOriginalFilename());
for (Map.Entry<String, String> e : otherParams.entrySet()) {
//这里是添加参数
builder.addTextBody(e.getKey(), e.getValue(),ContentType.MULTIPART_FORM_DATA);// 类似浏览器表单提交,对应input的name和value
}
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
// 将响应内容转换为字符串
obj =JSON.parseObject(EntityUtils.toString(responseEntity, "UTF-8"));
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
这里是调用
//这里就粘贴我实际应用的一块代码吧
@PostMapping("/send")
public JSONObject send(@RequestParam("file") MultipartFile file, @RequestParam("accessToken") String accessToken, @RequestParam("deviceSerial") String deviceSerial) {
Map dopost = new HashMap();
dopost.put("accessToken", accessToken);
dopost.put("deviceSerial", deviceSerial);
//第二个参数放文件 第三个参数调用的第三方API规定的文件参数名 第四个放map
JSONObject str = HttpUtil.doPostUploadFile("https://open.ys7.com/api/lapp/voice/sendonce", file, "file", dopost);
return str;
}
有一些接口会要求上传图片二进制字符串
方法
//这里两个导包路径
import org.springframework.web.multipart.MultipartFile;
import java.util.Base64;
/**
* 图片转化成base64字符串
* @param file
* @return
*/
public static String GetImageStr(MultipartFile file) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
byte[] fileByte = null;
try {
fileByte = file.getBytes();
} catch (IOException e) {
e.printStackTrace();
}
return Base64.getEncoder().encodeToString(fileByte);
}
代码为我开发中遇到并解决后的源码,实测可用