SpringBoot中接收form-data请求参数处理后请求外部接口

缺点:此方法接收文件参数后会建立个本地文件夹。如环境中不允许创建文件夹,请看另一篇接收文件参数后请求外部接口的文档。

 

    @Autowired
    private GatewayParams gatewayParams;

    @Override
    public String createbyfile (@RequestBody MultipartFile file,String title,String fileType){
        MultiValueMap<String,Object> params = new LinkedMultiValueMap<>();
        try {
            params.add("file",new FileSystemResource(convert(file)));
        } catch (IOException e) {
            e.printStackTrace();
        }
        params.add("title",title);
        params.add("fileType",fileType);


        //请求接口要传的头参数
        String appToken = gatewayParams.getGateDianZiToken();
        String appSecret = gatewayParams.getGateDianZiSecret();
        Date nowDate = new Date();
        Long timestamp = nowDate.getTime();
        double nonce = Math.random();
        //MD5加密头内容
        String signature= MD5Utils.stringToMD5(appToken+appSecret+timestamp.toString()+nonce);
        //封装请求外部接口的请求头参数
        HttpHeaders headers = new HttpHeaders();
        headers.set("x-qys-accesstoken",appToken);
        headers.set("x-qys-timestamp",timestamp.toString());
        headers.set("x-qys-nonce",nonce+"");
        headers.set("x-qys-signature",signature);
        //外部接口的请求地址
        String url =gatewayParams.getGateDianZiUrl() + "/v2/document/createbyfile";

        HttpEntity<?> httpEntity = new HttpEntity<>(params,headers);

        RestTemplate restTemplate =new RestTemplate();
        //请求外部接口
        ResponseEntity<JSONObject> response =restTemplate.postForEntity(url,httpEntity, JSONObject.class);

        Object result =response.getBody();
        if(result != null){
            Map<String,Object> resultMap = (Map<String, Object>) result;
            Map<String,Object> resultMap1=(Map<String, Object>)resultMap.get("result");
            //合同ID
            return (String) resultMap1.get("documentId");
        }else {
            return "";
        }

    }

    //创建本地文件夹
    public static File convert(MultipartFile file) throws IOException {
        File convFile = new File("temp_image",file.getOriginalFilename());
        if (!convFile.getParentFile().exists()) {
            // 应修改为log输出
            System.out.println("mkdir:" + convFile.getParentFile().mkdirs());
        }
        boolean fileBool=convFile.createNewFile();
        if( !fileBool){
            //应修改为log输出
            System.out.println("创建文件夹失败");
        }
        try (FileOutputStream fos= new FileOutputStream(convFile);){

            fos.write(file.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return convFile;
    }
MD5Utils是一个MD5加密的方法,是外部接口请求头约定需要的。
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {
    public static String stringToMD5(String plainText) {
        byte[] secretBytes = null;
        try {
            secretBytes = MessageDigest.getInstance("md5").digest(
                    plainText.getBytes()
            );
        }
        catch (NoSuchAlgorithmException e){
            throw  new RuntimeException("没有这个md5算法!");
        }
        String md5code = new BigInteger(1, secretBytes).toString(16);
        for(int i = 0; i < 32 - md5code.length(); i++){
            md5code = "0" + md5code;
        }
        return md5code;
    }
}
private GatewayParams gatewayParams;是我配置记录的外部接口的信息,包括接口地址、token信息,密钥等。
以下几个都是外部接口请求头需要的认证,不具有普遍性,自行甄别参考哈。
headers.set("x-qys-accesstoken",appToken);
headers.set("x-qys-timestamp",timestamp.toString());
headers.set("x-qys-nonce",nonce+"");
headers.set("x-qys-signature",signature);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Spring Boot应用程序,您可以使用Spring MVC的拦截器来拦截form-data请求接口。在拦截器,您可以对请求进行验证、修改或拒绝访问。下面是拦截form-data请求的步骤: 1. 创建一个实现了HandlerInterceptor接口的拦截器类。 2. 在拦截器实现preHandle()方法,对请求进行拦截和处理。在这个方法,您可以获取请求参数、头信息、请求方法等,并根据需要进行验证或修改。 3. 在Spring Boot应用程序配置该拦截器。这可以通过在配置类添加一个@Bean方法来实现。 下面是一个简单的拦截form-data请求的示例代码: ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @Component public class FormDataInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在这里可以对请求进行拦截和处理,比如验证请求参数、修改请求头等 if (request.getContentType() != null && request.getContentType().contains("multipart/form-data")) { // 对form-data请求进行拦截 // TODO: 对请求进行验证或修改 } // 返回true表示继续执行,返回false表示断执行 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在处理器执行完毕后调用,但是在DispatcherServlet进行视图返回渲染之前被调用 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在视图渲染完成后调用,用于清理资源等 } } ``` 在上面的代码,我们实现了HandlerInterceptor接口,并重写了preHandle()、postHandle()和afterCompletion()方法。在preHandle()方法,我们判断请求的Content-Type是否为multipart/form-data类型,如果是,则对请求进行拦截,并进行验证或修改。在postHandle()和afterCompletion()方法,我们没有进行任何操作。 最后,我们需要在Spring Boot应用程序配置该拦截器。这可以通过在配置类添加一个@Bean方法来实现: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new FormDataInterceptor()); } } ``` 在上面的代码,我们实现了WebMvcConfigurer接口,并重写了addInterceptors()方法。在该方法,我们将FormDataInterceptor拦截器添加到拦截器列表,以便在应用程序拦截form-data请求

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值