Httpclient使用formdata以及x-www-form-urlencoded 格式进行接口调用第三方平台接口并实现文件上传

先介绍环境

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);
    }

代码为我开发中遇到并解决后的源码,实测可用

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值