使用字符串

时间:2016-05-24 14:33:27

标签: c++ rest http

我正在使用boost工作在HTTP服务器上,我有一些关于形成HTTP响应的问题,特别是标题。

这是组装GET响应的代码:

std::string h = statusCodes[200]; // The status code is already finished with a '\r\n'                                                                                  
std::string t = "Date: " + daytime_() + "\r\n";                                                                         
std::string s = "Server: Muffin 1.0\r\n";                                                                               

std::string content = search->second();                                                                                 
std::string type = "Content-Type: text/html\r\n";                                                                       
std::string length = "Content-Length: " + std::to_string(content.size()) + "\r\n";                                      
res = h + t + s + length + type + "\r\n" + content + "\r\n";     

正如他们在website上所说的那样,标题为:

  

请求和响应消息的格式类似,并且   英语为主。这两种消息都包括:

     
      
  • 初始行,零个或多个标题行
  •   
  • 空行(即CRLF本身),
  •   
  • 和可选的邮件正文(例如文件,查询数据或查询输出)。
  •   

但是当我在服务器上发出请求时,只有日期在标题中,其余的直接在内容中

HTTP/1.1 200 OK                 // Header
Date: Tue May 24 10:28:58 2016  // Header

Server: Muffin 1.0              // Content
Content-Length: 31
Content-Type: text/html

This is supposed to be an ID

我不知道这是错误的,这是我第一次处理HTTP响应。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我终于找到了这个错误。

我的日间函数返回一个带换行符的字符串。

这是原始函数,它使用depreciated ctime

std::string
Response::daytime_()
{
    std::time_t now = std::time(0);
    return std::ctime(&now);
}

现在是strftime

的新功能
std::string
Response::daytime_()
{
    time_t rawtime;
    struct tm * timeinfo;
    char buffer[80];

    time (&rawtime);
    timeinfo = localtime(&rawtime);

    strftime(buffer,80,"%a %b %d %H:%M:%S %Y",timeinfo);
    std::string time(buffer);

    return time;
}

使用'\ n'

形成回复的新方法
std::string res = "";

std::string h = statusCodes[200];
std::string t = "Date: " + daytime_() + "\r\n";
std::string s = "Server: Muffin 1.0\r\n";

std::string content = search->second();
std::string type = "Content-Type: text/html\r\n";
std::string length = "Content-Length: " + std::to_string(content.size()) + "\r\n";
res = h + t + s + length + type + "\n" + content + "\r\n";