zoukankan      html  css  js  c++  java
  • CURL模拟表单post提交及相关常用参数的使用(包括提交表单同时上传文件)

    转载自:https://blog.csdn.net/freedomwjx/article/details/43278157
    (注:在curl前面加上time如time curl xxx,可以在最后显示访问时间,主要看real的那一栏)
    一. 首先,最简单的情况是我们只需要提交一个不带文件上传的表单,这种情况下,只需要在curl中使用--data(注意是--不是-)或者它的缩写-d即可。
    [plain] view plain copy
     
    1. curl -d "key=value&key=value" "url"  
        或者
    [plain] view plain copy
     
    1. curl --data "key=value&key=value" "url"  
        (注意:如果键值对只有一个的话,可以不写双引号,但是如果有多个键值对,必须加上双引号,键值对之间用&连接)
     
        现在假设我们有一个登陆表单,它看起来可能是这样的
    [html] view plain copy
     
    1. <form  action="doLogin" method="post">  
    2.     <input type="text"  name="username"  value="admin"/>  
    3.     <input type="password"  name="password"  value="admin"/>  
    4.     <button type="submit"  value="submit" />  
    5. </form>  
        那我们的curl就应该写成这样
    [plain] view plain copy
     
    1. curl -d "username=admin&password=admin" "www.xxxx.com/doLogin"  
        如果登陆后网页被重定向,而我们想追踪这个重定向的话可以加上-L参数(L必须大写),表示追踪重定向
    [plain] view plain copy
     
    1. curl -L  -d "username=admin&password=admin" "www.xxx.com/doLogin"  
    二. 稍微复杂的情况:现在我们希望进行一些必须在登陆前提下的post请求,那就需要先保存我们之前的成功登陆的cookie信息,然后再携带登陆信息进行post请求
        1.保存登陆cookie信息到文件可以通过以下2个选项中的任意一个实现
        -c :保存cookie信息
        -D:保存整个header信息,包括cookie
        示例:
    [plain] view plain copy
     
    1. curl -c cookie.txt  -d "username=admin&password=admin" "www.xxx.com/doLogin"  
        运行后会在你执行指令的目录下生成一个cookie.txt文件,当然你也可以指定该文件的创建路径,相对路径绝对路径皆可(如cookie.txt可以改成 /path/cookie.txt)
     
        2.携带登陆信息进行post请求需要使用-b选项
            -b:指定使用哪个文件
            示例:
    [plain] view plain copy
     
    1. curl -L -b cookie.txt -d "key=value" "url"  
    三. 模拟表单文件上传,相当于form表单中method="POST"和enctype="multipart/form-data"的情况
            
            这个时候就需要用到-F选项了
            curl -F "key=@value" "url"
     
            假目前我们的文件上传表单是这样的:
    [html] view plain copy
     
    1. <form  action="upload" method="post" enctype="multipart/form-data">  
    2.     <input type="file"  name="myfile" />  
    3.     <button type="submit"  value="submit" />  
    4. </form>  
            我们想提交一个名为hellocurl.zip的文件,该文件在我们指令所在的根目录下。
     
            那我们的curl就是这样的
    [plain] view plain copy
     
    1. curl -F "myfile=@hellocurl.zip" "www.xxx.com/upload"  
            如果上传的文件不止一个,可以写多个-F "key=@value"
    [plain] view plain copy
     
    1. curl -F "myfile1=@hellocurl1.zip" -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload"  
            再来看一个更加贴近实际的情况:很多时候,我们的表单还会包含许多其他表单元素,如text,checkbox,select等等。
            
            现在我们在上面表单的基础上加入更多元素,变成下面这样:
    [html] view plain copy
     
    1. <form  action="upload" method="post" enctype="multipart/form-data">  
    2.     <span style="color:#990000;"><input type="text"  name="filename"  value="hellocurl"/></span>  
    3.     <input type="file"  name="myfile" />  
    4.     <button type="submit"  value="submit" />  
    5. </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的方式来解决
     
            即:
    [plain] view plain copy
     
    1. curl -F "filename=hellocurl" -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload"  
            但是我在一个spring mvc的项目中测试这个方法的时候发现,由于拿不到filename的值,无法绕过服务器端的验证,导致提交失败
            如果你也碰到类似的情况,可以尝试下以下解决方法:
    [plain] view plain copy
     
    1. curl -F "key=@value" "www.xxx.com/upload?key1=value1&key2=value2"  
            具体到当前的问题我们的curl就是:
    [plain] view plain copy
     
    1. 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
  • 相关阅读:
    函数式宏定义与普通函数
    linux之sort用法
    HDU 4390 Number Sequence 容斥原理
    HDU 4407 Sum 容斥原理
    HDU 4059 The Boss on Mars 容斥原理
    UVA12653 Buses
    UVA 12651 Triangles
    UVA 10892
    HDU 4292 Food
    HDU 4288 Coder
  • 原文地址:https://www.cnblogs.com/silentdoer/p/9055179.html
Copyright © 2011-2022 走看看