使用 curl 发送 POST 请求的几种方式及重点讲解curl文件上传的后端代码实现案例
一、使用 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和valuebuilder.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的对应实现核心代码。
纸上得来终觉浅,绝知此事要躬行。~
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!