shell脚本中使用curl调用java接口的四种场景,已经传输文件遇到的坑

背景:

  开发中经常遇到,在shell脚本中需要使用到curl调用java接口,今天就来记录几个调用方法,以及对应java端接口写法。

场景一:Get请求,路径入参

// curl写法(变量定义是可以使用eval,具体用法自行百度)

eval token="AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
system_code="cccccccc"
curl --header "x-token: $token" https://AAA.com/auto/findProjectBySN?sn=${system_code} )

// java端写法

@RestController
@RequestMapping("/auto")
public class testController{

    @GetMapping("/findProjectBySN/{sn}")
    public ResponseInfo<String> findProjectBySN(@PathVariable("sn") String sn){
        return ResponseInfo.success("查询成功");
    }
}

场景二:Get请求,param入参

eval token="AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
system_code="cccccccc"
curl --header "x-token: $token" -F"sn=${system_code}" https://AAA.com/auto/findProjectBySN )

// java端写法

@RestController
@RequestMapping("/auto")
public class testController{

    @GetMapping("/findProjectBySN}")
    public ResponseInfo<String> findProjectBySN(@RequestParam("sn") String sn){
        return ResponseInfo.success("查询成功");
    }
}

场景三:post请求,请求对象为json类型

eval token="AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
data="{ \"branch\":\"feature_0101\" , \"gitUrl\":\"https://gitAAA.com/test/ttTest.git\" , \"project\":\"ABC\" , \"repo\":\"ttTest\"  }"
curl --X POST -H 'Content-Type: application/json' --header "x-token: $token" -d"data=$data" https://AAA.com/auto/findProjectBySN )

// java端写法

@RestController
@RequestMapping("/auto")
public class testController{
    @PostMapping("/findProjectBySN}")
    public ResponseInfo<String> findProjectBySN(@RequestBody testForm form){
        return ResponseInfo.success("查询成功");
    }
}

定义实体类
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class testForm {
    private String project;
    private String repo;
    private String branch;
    private String gitUrl;
}

场景四:post请求,请求参数同时为多个入参,以及文件

// -F"file=@/workspace/$REPONAME_0/output.xml"为传递的文件
eval token="AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
curl --X POST -F"branch=feature_0101" -F"gitUrl=https://gitAAA.com/test/ttTest.git" -F"project=ABC" -F"repo=ttTest" -F"file=@/workspace/$REPONAME_0/output.xml" -H 'Content-Type: multipart/form-data' --header "x-token: $token" https://AAA.com/auto/findProjectBySN )

// java端写法

@RestController
@RequestMapping("/auto")
public class testController{
    @PostMapping("/findProjectBySN}")
    public ResponseInfo<String> findProjectBySN(@RequestParam("project") String project,
                                        @RequestParam("gitUrl") String gitUrl,
                                        @RequestParam("branch") String branch,
                                        @RequestParam("repo") String repo,
                                        @RequestParam("file") MultipartFile file){
        return ResponseInfo.success(内部方法);
    }
}

场景四中遇到了问题

  1. 大家都知道,保存MultipartFile可以使用transferTo();方法。
    但是该方法需要自己先创建一个file对象去接受文件内容,如下
File newFile = new File("/path/new.txt");
if (newFile .createNewFile()) {
     System.out.println("File created: " + file.getName());
} else {
     System.out.println("File already exists.");
}
if(newFile.canRead()){
    System.out.println("File can read.");
}else{
    System.out.println("File cannot read");
}

if(newFile.canWrite()){
    System.out.println("File can Write.");
}else{
    System.out.println("File cannot Write");
}
file.transferTo(newFile..getAbsoluteFile());
注意,transferTo方法内,必须使用绝对路径
  1. 由于我的内部方法,使用了@Async异步方法,导致执行transferTo方法的时候,一直报错,找不到一个奇奇怪怪的临时文件。
    起初我以为是newFile 的问题,但是我的newFile是刚创建的文件,并且代码中也是,当前文件是存在读写权限的。
    查阅资料发现,是@Async的问题,异步方法中,主线程结束,保存MultipartFile的临时文件被删除,所以,file.transferTo(newFile…getAbsoluteFile());报错中找不到的临时文件,是file,而不是newFile。
    解决方法
    一,保存文件的内容,在主线程中将保存文件的步骤做完。但是文件太大可能要考虑性能问题。
    二,在主线成中,将文件流传入异步线程中,传参使用file.getInputStream()。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值