最近,实现一个网站的登录查询。遇到 multipart/form-data 数据提交。
POST /admin/api/common/syslogin HTTP/1.1
Host: xxx.xx.xx.xxx
Connection: keep-alive
Accept: /
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary2J9pBdI8Br01PKAS
Origin: http://xxx.xxx.xx.xx.xxx
Referer: http://xxx.xx.xx.xxx/admin/common/index.html?userAccount=abcdef&token=dc9c536c-d894-4454-af2b-eee27316a49c&income=0&output=1¢er=0&ying=0
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: token=eyJ1c2VyQWNjb3VudCI6IjgwODY5dGNrIiwidG9rZW4iOiJkYzljNTM2Yy1kODk0LTQ0NTQtYWYyYi1lZWUyNzMxNmE0OWMifQ==
Accept-Encoding: gzip, deflate
Content-Length: 278
------WebKitFormBoundary2J9pBdI8Br01PKAS
Content-Disposition: form-data; name=“token”
dc9c536c-d894-4454-af2b-eee27316a49c
------WebKitFormBoundary2J9pBdI8Br01PKAS
Content-Disposition: form-data; name=“userAccount”
abcdef
------WebKitFormBoundary2J9pBdI8Br01PKAS–
Clever Internet控件显然没有这个选项,测试几次失败。
以下为失败测试:
strPOSTText := '------WebKitFormBoundary2J9pBdI8Br01PKAS' + #13#10
+ 'Content-Disposition: form-data; name="token"' + #13#10
+ #13#10
+ strtoken + #13#10
+ '------WebKitFormBoundary2J9pBdI8Br01PKAS' + #13#10
+ 'Content-Disposition: form-data; name="userAccount"' + #13#10
+ #13#10
+ strUser
+ '------WebKitFormBoundary2J9pBdI8Br01PKAS--';
clHttpRequest.Header.ContentType := 'multipart/form-data; boundary=------WebKitFormBoundary2J9pBdI8Br01PKAS';
clHttpRequest.ClearItems;
clHttpRequest.AddTextData(strPOSTText);
response := TMemoryStream.Create();
clHttp1.Post(strURL,clHttpRequest,response);
返回失败。
再次对原提交网络监听分析发现
POST数据结构如下:
token dc9c536c-d894-4454-af2b-eee27316a49c 36
userAccount abcdef 8
改用经典的POST方式,OK提交成功。
代码如下
clHttpRequest.ClearItems;
clHttpRequest.AddFormField('token',‘dc9c536c-d894-4454-af2b-eee27316a49c 36’);
clHttpRequest.AddFormField('userAccount',‘abcdef’);
response := TMemoryStream.Create();
clHttp1.Post(strURL,clHttpRequest,response);
返回:
{“loginuser”:{“userzh”:“80869tck”,“input_username”:“测试”},“rtnMsg”:“登录成功!”,“rtnCode”:“0000”}