CURL模拟表单post提交及相关常用参数的使用(包括提交表单同时上传文件)
2017-08-31 14:18
716 查看
转:
http://blog.csdn.net/freedomwjx/article/details/43278157
一. 首先,最简单的情况是我们只需要提交一个不带文件上传的表单,这种情况下,只需要在curl中使用–data(注意是–不是-)或者它的缩写-d即可。
或者
(注意:如果键值对只有一个的话,可以不写双引号,但是如果有多个键值对,必须加上双引号,键值对之间用&连接)
那我们的curl就应该写成这样
如果登陆后网页被重定向,而我们想追踪这个重定向的话可以加上-L参数(L必须大写),表示追踪重定向
二. 稍微复杂的情况:现在我们希望进行一些必须在登陆前提下的post请求,那就需要先保存我们之前的成功登陆的cookie信息,然后再携带登陆信息进行post请求
1.保存登陆cookie信息到文件可以通过以下2个选项中的任意一个实现
-c :保存cookie信息
-D:保存整个header信息,包括cookie
示例:
运行后会在你执行指令的目录下生成一个cookie.txt文件,当然你也可以指定该文件的创建路径,相对路径绝对路径皆可(如cookie.txt可以改成 /path/cookie.txt)
三. 模拟表单文件上传,相当于form表单中method=”POST”和enctype=”multipart/form-data”的情况
我们想提交一个名为hellocurl.zip的文件,该文件在我们指令所在的根目录下。
如果上传的文件不止一个,可以写多个-F “key=@value”
再来看一个更加贴近实际的情况:很多时候,我们的表单还会包含许多其他表单元素,如text,checkbox,select等等。
同时我们想提交hellocurl.zip文件
但是我在一个spring mvc的项目中测试这个方法的时候发现,由于拿不到filename的值,无法绕过服务器端的验证,导致提交失败
如果你也碰到类似的情况,可以尝试下以下解决方法:
具体到当前的问题我们的curl就是:
http://blog.csdn.net/freedomwjx/article/details/43278157
一. 首先,最简单的情况是我们只需要提交一个不带文件上传的表单,这种情况下,只需要在curl中使用–data(注意是–不是-)或者它的缩写-d即可。
curl -d "key=value&key=value" "url"
或者
curl --data "key=value&key=value" "url"
(注意:如果键值对只有一个的话,可以不写双引号,但是如果有多个键值对,必须加上双引号,键值对之间用&连接)
现在假设我们有一个登陆表单,它看起来可能是这样的
<form action="doLogin" method="post"> <input type="text" name="username" value="admin"/> <input type="password" name="password" value="admin"/> <button type="submit" value="submit" /> </form>
那我们的curl就应该写成这样
curl -d "username=admin&password=admin" "www.xxxx.com/doLogin"
如果登陆后网页被重定向,而我们想追踪这个重定向的话可以加上-L参数(L必须大写),表示追踪重定向
curl -L -d "username=admin&password=admin" "www.xxx.com/doLogin"
二. 稍微复杂的情况:现在我们希望进行一些必须在登陆前提下的post请求,那就需要先保存我们之前的成功登陆的cookie信息,然后再携带登陆信息进行post请求
1.保存登陆cookie信息到文件可以通过以下2个选项中的任意一个实现
-c :保存cookie信息
-D:保存整个header信息,包括cookie
示例:
curl -c cookie.txt -d "username=admin&password=admin" "www.xxx.com/doLogin"
运行后会在你执行指令的目录下生成一个cookie.txt文件,当然你也可以指定该文件的创建路径,相对路径绝对路径皆可(如cookie.txt可以改成 /path/cookie.txt)
2.携带登陆信息进行post请求需要使用-b选项 -b:指定使用哪个文件 示例:
curl -L -b cookie.txt -d "key=value" "url"
三. 模拟表单文件上传,相当于form表单中method=”POST”和enctype=”multipart/form-data”的情况
这个时候就需要用到-F选项了 curl -F "key=@value" "url" 假目前我们的文件上传表单是这样的
<form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="myfile" /> <button type="submit" value="submit" /> </form>
我们想提交一个名为hellocurl.zip的文件,该文件在我们指令所在的根目录下。
那我们的curl就是这样的
curl -F "myfile=@hellocurl.zip" "www.xxx.com/upload"
如果上传的文件不止一个,可以写多个-F “key=@value”
curl -F "myfile1=@hellocurl1.zip" -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload"
再来看一个更加贴近实际的情况:很多时候,我们的表单还会包含许多其他表单元素,如text,checkbox,select等等。
现在我们在上面表单的基础上加入更多元素,变成下面这样:
<form action="upload" method="post" enctype="multipart/form-data"> <span style="color:#990000;"><input type="text" name="filename" value="hellocurl"/></span> <input type="file" name="myfile" /> <button type="submit" value="submit" /> </form>
同时我们想提交hellocurl.zip文件
这时候我们可能会想到加上-d 特别注意,这个时候我们不能同时使用-d和-F,这2个选项在curl中是两种方式的请求,-d为application/x-www-url-encoded方式发送post请求,而-F为multipart/form-data方式, 如果在一次curl中同时使用-d和-F选项会报Warning: You can only select one HTTP request!的警告,导致指令无法执行 这种情况下,现在网上很多给出的解决方案是通过增加-F的方式来解决 即:
curl -F "filename=hellocurl" -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload"
但是我在一个spring mvc的项目中测试这个方法的时候发现,由于拿不到filename的值,无法绕过服务器端的验证,导致提交失败
如果你也碰到类似的情况,可以尝试下以下解决方法:
curl -F "key=@value" "www.xxx.com/upload?key1=value1&key2=value2"
具体到当前的问题我们的curl就是:
curl -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload?filename=hellocurl"
该方法亲测通过,并且仍然是post的提交方式。 其他一些实用选项: -v:查看请求的整个完整的过程 -i:查看请求头信息 -o:保存响应结果到指定路径的文件中,如: curl -o tmp.txt http://www.csdn.net #保存响应到tmp.txt
相关文章推荐
- CURL模拟表单post提交及相关常用参数的使用(包括提交表单同时上传文件)
- 使用java ssm框架后台模拟post上传文件并提交表单数据
- HttpClien实现使用post方式模拟表单上传大文件和字符参数
- 使用ajax提交form表单,包括ajax文件上传
- 使用ajax提交form表单,包括ajax文件上传
- PHP使用curl模拟post上传及接收文件的方法
- HttpClient使用post方式模拟表单提交数据到服务器并下载服务器文件
- 使用ajax提交form表单,包括ajax文件上传
- 使用python模拟post表单上传文件
- 使用ajax提交form表单,包括ajax文件上传
- 使用ajax提交form表单,包括ajax文件上传
- [C#]使用WebClient上传文件并同时Post表单数据字段到服务端
- HttpClient使用post方式模拟表单提交数据到服务器并下载服务器文件
- 使用ajax提交form表单,包括ajax文件上传
- Android中模拟post表单提交,带参数及文件参数
- 使用Javascript XMLHttpRequest模拟表单(Form)提交上传文件
- 使用ajax提交form表单,包括ajax文件上传
- java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例
- 使用ajax提交form表单,包括ajax文件上传