boa web测试5:cgi 获取get提交的数据
一 原理和代码
原理,通过环境变量QUERY_STRING获取GET方法传递的参数 。
例如有如下URL,
http://192.168.31.138/cgi-bin/main.cgi?user_name=hello&user_password=world&submit=submit
那么环境变量的值就是?后面的字符串user_name=hello&user_password=world&submit=submit
测试代码:
#include <iostream>
#include <string>
#include <stdio.h>
#include <sstream>
#include <string.h>
using namespace std;
int main(int argc,char *argv[])
{
printf("Content-type:text/html\n\n"); //这句一定要加上
string html_string = R"(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
p{
color:#0000ff
}
img{
width: 300;
height: 500px;
}
</style>
</head>
<body>
<script>
var cur_index = 0;
document.write("0" + cur_index++ + ".jpg<br>");
document.write("0" + cur_index++ + ".jpg<br>");
document.write("0" + cur_index++ + ".jpg<br>");
document.write("0" + cur_index++ + ".jpg<br>");
document.write("0" + cur_index++ + ".jpg<br>");
</script>
<p>hello world!</p>
</body>
</html>)";
cout << html_string << endl;
printf("argc = %d\n",argc);
for(int i = 0; i < argc;i++){
printf("argv[%d]=%s\n",i,argv[i]);
}
printf("<br>");
char *method_get_data = getenv("QUERY_STRING");
if(!method_get_data){
printf("no parameter\n");
}
else{
printf("method_get_data = %s\n",method_get_data);
}
printf("<br>");
char user_name[100];
char user_password[100];
char submit[100];
sscanf(method_get_data,"user_name=%s&user_password=%s",user_name,user_password);
printf("user_name=%s<br>",user_name);
printf("user_password=%s<br>",user_password);
istringstream iss(method_get_data);
string token;
printf("------<br>");
while(getline(iss, token,'&')){
const char *ptoken = token.c_str();
if(strstr(ptoken,"user_name")){
sscanf(ptoken,"user_name=%s",user_name);
}else if(strstr(ptoken,"user_password")){
sscanf(ptoken,"user_password=%s",user_password);
}
else if(strstr(ptoken,"submit")){
sscanf(ptoken,"submit=%s",submit);
}
}
printf("user_name=%s<br>",user_name);
printf("user_password=%s<br>",user_password);
printf("submit=%s<br>",submit);
printf("------<br>");
return 0;
}
测试html页面:
<html>
<head>
<title>
hello boa
</title>
</head>
<body>
<a href="cgi-bin/main.cgi">main.cgi</a>
<form method="get" action="cgi-bin/main.cgi">
用户名:<input type="text" name="user_name">
<p></p>
密码:<input type="password" name="user_password">
<p></p>
<input type="submit" name="submit" value="submit">
<input type="reset" name="reset" value="reset">
</form>
</body>
</html>
二 开始测试
提交以后获得的值:从结果可知,如果使用sscanf获得的值是有问题的,需要使用istringstream先分隔字符串,然后再判断,得到的值才正确,应该还有更简介的方法吧。
莫照生: 高质量博客,很实用,点赞点赞
努力学习LINUX的嵌入式开发工程师: 哥你真的是我的神
tianyazhichiC: 正解,简洁有效
Evan_Arm: 好的,谢谢,我查一下
千册: 看样子是解压失败了,你按照Trying to unpack rootfs image as initramfs,这句提示,沿着这条线走