使用 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

1
$ curl localhost:3000/api/json -X POST -d '{"hello": "world"}' --header "Content-Type: 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 内容如下:

1
2
3
4
5
{"hello": "world","xxx": "yyy","a": ["ooo", "mmm"]
}

就可以通过

1
$ curl localhost:3000/api/json -X POST -d @data.json --header "Content-Type: application/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的对应实现核心代码。

 

纸上得来终觉浅,绝知此事要躬行。~


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部