背景:
开发中经常遇到,在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(内部方法);
}
}
场景四中遇到了问题
- 大家都知道,保存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方法内,必须使用绝对路径
- 由于我的内部方法,使用了@Async异步方法,导致执行transferTo方法的时候,一直报错,找不到一个奇奇怪怪的临时文件。
起初我以为是newFile 的问题,但是我的newFile是刚创建的文件,并且代码中也是,当前文件是存在读写权限的。
查阅资料发现,是@Async的问题,异步方法中,主线程结束,保存MultipartFile的临时文件被删除,所以,file.transferTo(newFile…getAbsoluteFile());报错中找不到的临时文件,是file,而不是newFile。
解决方法
一,保存文件的内容,在主线程中将保存文件的步骤做完。但是文件太大可能要考虑性能问题。
二,在主线成中,将文件流传入异步线程中,传参使用file.getInputStream()。