一、使用 curl 发送 POST 请求的几种方式
HTTP 的 POST 请求通常是用于提交数据,可以通过这篇文章来了解各种提交方式:四种常见的 POST 提交数据方式。做 Web 后端开发时,不可避免地要自己给自己发请求来调试接口,这里要记录的内容是如何使用命令行工具 curl 来进行各种方式的 POST 请求。
application/x-www-form-urlencoded
最常见的一种 POST 请求,用 curl 发起这种请求也很简单。
1 | $ curl localhost:3000/api/basic -X POST -d 'hello=world' |
multipart/form-data
这种请求一般涉及到文件上传。后端对这种类型请求的处理也复杂一些。
1 | $ curl localhost:3000/api/multipart -F raw=@raw.data -F hello=world |
application/json
| |
跟发起 application/x-www-form-urlencoded 类型的 POST 请求类似,-d 参数值是 JSON 字符串,并且多了一个 Content-Type: application/json 指定发送内容的格式。
这个例子和 application/x-www-form-urlencoded 中的例子发起的请求,到了 Web 后端经过解析后,得到的结果都是 hello: world 键值对。
文件内容作为要提交的数据
如果要提交的数据不像前面例子中只有一个 hello: world 键值对,数据比较多,都写在命令行里很不方便,也容易出错,那么可以把数据内容先写到文件里,通过 -d @filename 的方式来提交数据。这是 -d 参数的一种使用方式,所以前面用到 -d 参数的地方都可以这样用。
实际上就是把 -d 参数值写在命令行里,变成了写在文件里。跟 multipart/form-data 中上传文件的 POST 方式不是一回事。@ 符号表明后面跟的是文件名,要读取这个文件的内容作为 -d 的参数。
例如,有一个 JSON 文件 data.json 内容如下:
| |
就可以通过
| |
来提交数据。
如果要用 application/x-www-form-urlencoded 方式提交,后端解析出来同样的数据,那么 -d 的参数是这样的(注意数组参数的写法)
1 | hello=world&xxx=yyy&a[]=ooo&a[]=mmm |
把这个字符串直接作为 -d 的参数或者把它写到文件 data.txt 然后通过 -d @data.txt 的方式,发起 POST 请求,行为和结果是一样的。
1 2 3 | $ curl localhost:3000/api/basic -X POST -d 'hello=world&xxx=yyy&a[]=ooo&a[]=mmm' $ curl localhost:3000/api/basic -X POST -d @data.txt |
二、curl文件上传的后端代码实现案例
背景:最近在对接人脸识别服务,在对接过程中遇到一个技术难题。在查阅众多资料和试验之后,将成果记录一下。
如图:

在curl 命令中的这段如何对应java代码?
直接上代码:
public String videoLiveness(String fileName,String path) {
final String remote_url = "http://ip:port/video_liveness";// 第三方服务器请求地址
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
try {
File file = new File(path);
HttpPost httpPost = new HttpPost(remote_url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//设置浏览器兼容模式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//设置请求的编码格式
builder.setCharset(Consts.UTF_8);
builder.addBinaryBody("video", file, ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
// builder.addBinaryBody("flag","1234".getBytes());
// builder.addBinaryBody("token","20210222130327-728054".getBytes());
// builder.addPart("video", new FileBody(file));// 类似浏览器表单提交,对应input的name和value
// builder.addBinaryBody("name=\"File\"; filename=\"1234.mp4\"", file);//添加文件
builder.addTextBody("flag", "1234");// 类似浏览器表单提交,对应input的name和value
builder.addTextBody("token", "20210222130327-728054");
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
// 将响应内容转换为字符串
result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
如上图,标红的就是curl与java的对应实现核心代码。
纸上得来终觉浅,绝知此事要躬行。~
本文介绍了使用curl进行POST请求的多种方式,包括携带JSON数据、文件上传等,并提供了文件内容作为POST数据的提交方法。同时,文章分享了针对curl文件上传的后端Java代码实现案例,帮助理解接口调试和数据处理。
660

被折叠的 条评论
为什么被折叠?



