舉個例子:
http://www.test.cn:8080/max/123.html?name=kevinchuang&pwd=123456#first
通常http鏈接部分都是固定,我們需要關心的是從“?”到“#”部分的數據部分。
比如現在我們要構造一個GET請求:
string url = "http://www.test.cn:8080/max/123.html";
url += "?";
map<string, string> data;
data["name"] = "kevinchuang";
data["pwd"] = "123456";
map2str(url, data);
這裏我們看一下構造接口:
#define FIELD_FLAG "&"
#define VALUE_FLAG "="
typedef map<string, string> Data;
void map2str(string &url, const Data &data)
{
for(Data::iterator it = data.begin(); it != data.end(); it++)
{
url += it->first.c_str();
url += VALUE_FLAG;
url += it->second.c_str();
url += FIELD_FLAG;
}
if(url.size())
{
string tmp(url.c_str(), url.size()-1);
url = tmp;
}
}
現在假如我們收到了key=value格式的buf數據,怎麼方便使用了?
void str2map(string &buf, Data &data)
{
string bvalue, fname, fvalue;
string stbuf = buf;
while(get_field(stbuf, bvalue))
{
if(!get_value(bvalue, fname, fvalue))
{
continue;
}
data[fname]=fvalue;
}
}
int get_field(string &str, string &value)
{
if(str.size() ==0)
{
return 0;
}
string::size_type start = str.find(FIELD_FLAG);
if(start == string::npos || start !=0)
{
start= 0;
}
else
{
start += strlen(FIELD_FLAG);
}
string::size_type end = str.find(FIELD_FLAG, start);
if(end == string::npos)
{
end = str.size();
}
value = str.substr(start, end - start);
str = str.substr(end);
return 1;
}
int get_value(const string &str, string &name, string &value)
{
string::size_type pos = str.find(VALUE_FLAG);
if(pos == string::npos)
{
return 0;
}
name = str.substr(0, pos);
value = str.substr(pos + strlen(VALUE_FLAG));
return 1;
}