首页 > 代码库 > web_submit_data详解

web_submit_data详解

定义:处理无状态或者上下文无关的表单提交。它用来生成表单的GET或POST请求,这些请求与Form自动生成的请求是一样的,发送这些请求时不需要表单上下文。 
函数形式:web_submit_data( const char *StepName, const char *Action, , ITEMDATA, , [ EXTRARES, ,] LAST ); 
技术分享

说明:

  • 当VuGen设为基于URL的录制模式,或者基于HTML的录制方式时,但 Recording Options—HTML Advanced下的A script containing explicit URLs only选项被选中时,web_submmit_data函数才会被录制。

  • 不论采用URL查询的方式(GET),还是采用请求体发送(POST)的方式,此函数都指示出Form中的数据是如何发送到服务器的。

  • 如果VuGen处于HTTP录制模式下,此时记录Web进程时,会产生此函数。在提交Form时,如果无法生成web_submit_form函数,VuGen也会生成web_submit_data函数。

  • 在录制选项中,Toos—Recording Option下—Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源。只有选择了“Record within the current script step”时,List of Resource Attributes才会被录制到。非HTML资源(如:gif和jpg等图象文件)。

  • 任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当省略了“EncType”时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有web_add_[auto_]header函数,且“Method=POST”,“application/x-www-form-urlencoded”会作为默认值来使用。其他情况下,不会产生Content-Type请求头。

  • ContentType:文件类型标识符,如果“EncType”是“multipart/form-data”用来上传文件时,需要用到“ContentType”。当在ITEMDATA中的Data子句中指定了“File=Yes”,且文件也在此子句中,ContentType才适用,此时它会作为同一个子句的值来传递。正常情况下,“Content-Type”根据所上传文件的扩展名自动生成。如:

7d025e2b16b064e\r\n Content–Disposition: form–data; name="uploaded_file"; filename="D:\\temp\\a.txt"\r\n Content–Type: text/plain\r\n \r\n



  • “ContentType”如果指定了空值,那么“Content-Type”头将不包含在文件中。如果没有显示的指定“ContentType”的值,当上传的文件为空时,不管文件扩展名是什么,都默认使用“application/x-unknown-content-type”做为”ContentType”的值。VuGen不会检查指定的ContentType是否有效。

  • 通常情况下,如果录制了web_submit_data函数,VuGen会把“name”和“value”一起录制到ITEMDATA一节中。如果不想在脚本中以明文显示“value”,可以对它进行加密。把“Value”改为“EncryptedValue”,然后把录制到的值改为加密后的值。请参考web_submit_form中相关的内容。

示例1:一般的表单提交

web_submit_data("default.aspx", 
    "Action=http://lazarus/flightnet/default.aspx", 
    "Method=POST", 
    "TargetFrame=", 
    "RecContentType=text/html", 
    "Referer=http://lazarus/flightnet/", 
    "Snapshot=t7.inf", 
    "Mode=HTML", 
    ITEMDATA, 
    "Name=grpType", "Value=http://www.mamicode.com/radRoundtrip", ENDITEM, 
    "Name=lstDepartingCity", "Value=http://www.mamicode.com/DEN", ENDITEM, 
    "Name=lstDestinationCity", "Value=http://www.mamicode.com/LAX", ENDITEM, 
    "Name=txtDepartureDate", "Value=http://www.mamicode.com/8/19/2003", ENDITEM, 
    "Name=txtReturnDate", "Value=http://www.mamicode.com/8/19/2003", ENDITEM, 
    "Name=txtQuantity", "Value=http://www.mamicode.com/1", ENDITEM, 
    "Name=radClass", "Value=http://www.mamicode.com/1", ENDITEM, 
    "Name=radSeat", "Value=http://www.mamicode.com/1", ENDITEM, 
    "Name=btnAvailableFlights", "Value=http://www.mamicode.com/Next >", ENDITEM, 
    LAST ); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

示例2:web_submit_data使用POST方法提交两个文件

web_submit_data("Attachments", 
    "Action=http://barton.cottage@.Devonshire.uk/Attachments?YY=45434", 
    "Method=POST", 
    "EncType=multipart/form–data", 
    "TargetFrame=", 
    "RecContentType=text/html", 
    "Referer=http:///barton.cottage@.Devonshire.uk/Compose?YY=20435", 
    "Snapshot=t5.inf", 
    "Mode=HTML", 
    ITEMDATA, 
        "Name=userFile0", 
        "Value=http://www.mamicode.com/E://sense_sensibility//Elinor.htm", 
        "File=yes", 
        "ContentType=text/html", // Override default "text/plain" for .txt files 
        FilePath=Elinor.txt", 
        "ContentTransferEncoding=html/text", 
    ENDITEM, 
        "Name=userFile1", 
        "Value=http://www.mamicode.com/E:\\sense_sensibility\\Marianne.jpg", 
        "File=yes", 
    ENDITEM, 
    LAST ); 

注:表单中enctype="multipart/form-data"的意思是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作。
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。

java scripts:

web.submit_data("saveFile2",
          "Action=<m_host>/myLoan-mobile/action/api/saveFile",
          new String[]{ //options[]
         "Method=POST",
        "EncType=multipart/form-data",
        "RecContentType=application/josn",
        "Mode=HTTP"
    },
        new String[]{ //data[]
       "Name=token", "Value=http://www.mamicode.com/", web.ENDITEM,
       "Name=pictureFile", "Value=http://www.mamicode.com/E://LRWorkspace//loginandsavephototest//imageidcardfrontpath.jpeg",
       "File=YES",
       "ContentType=image/jpeg",  //不加这一行,LR默认设置为ContentType=image/pjpeg格式,回放失败。
       web.ENDITEM,
      web.LAST
});

 

传图片时,ie会把 jpg、jpeg翻译成image/pjpeg,png翻译成image/x-png 。而火狐则很标准:jpg、jpeg翻译成image/jpeg,png翻译成image/png。

 

为了避免这个问题,我在多个浏览器上做了测试,结果如下:

firefox image/jpeg image/bmp image/gif image/png

ie 6 image/pjpeg image/bmp image/gif image/x-png

ie 7 image/pjpeg image/bmp image/gif image/x-png

ie 8 image/pjpeg image/bmp image/gif image/x-png

web_submit_data详解