使用libmicrohttpd处理POST请求

时间:2015-04-17 13:19:23

标签: c++ http put

我使用libmicrohttpd来设置REST服务器。 GET请求没有问题,但我不明白我做错了什么来处理POST(实际上是PUT)请求(JSON格式)。这是代码:

int MHD_answer_to_connection (void* cls, struct MHD_Connection* connection, 
              const char* url, 
              const char* method, const char* version, 
              const char* upload_data, 
              size_t* upload_data_size, void** con_cls) {


  // Initializes parser/camera/settings...
  static Parser parser;

  // The first time only the headers are valid, do not respond in the first round
  static int dummy;
  if (*con_cls != &dummy) {
    *con_cls = &dummy;
    return MHD_YES;
  }

  // Parse URL to get the resource
  int resource = parser.getRequestedResource(url);

  // Check wether if it's a GET or a POST method
  if(strcmp(method, MHD_HTTP_METHOD_GET) == 0) {
    parser.processGetRequest(resource);
  }
  else {
    parser.processPutRequest(upload_data, *upload_data_size);
  }

  // Building HTTP response (headers+data)
  MHD_Response* httpResponse = parser.getResponse();

  int ret = MHD_queue_response (connection, MHD_HTTP_OK, httpResponse);

  if (ret != MHD_YES) {
    Logger::get().error("Error queuing message");
  }

  MHD_destroy_response (httpResponse);
  // Clear context pointer
  *con_cls = NULL; 

  return ret;
}

每当我尝试发送带有一些数据的PUT请求时,我得到"内部应用程序错误,关闭连接"。问题可能来自以下方面之一:

  • 首次致电时发布/未发布回复

  • 是否修改* upload_data_size(表示已完成处理)

  • *con_cls = NULL指令的好位置

谢谢!

2 个答案:

答案 0 :(得分:2)

我也使用 GNU libmicrohttpd ,我在其repository上找到了一个简单的POST演示。

演示有点简单:它有一个表格询问你的名字,所以当你输入你的名字并点击"发送"按钮,发布的数据在answer_to_connection()函数中处理:

static int answer_to_connection (void *cls, struct MHD_Connection *connection,
                      const char *url, const char *method,
                      const char *version, const char *upload_data,
                      size_t *upload_data_size, void **con_cls)
{


...

  if (0 == strcmp (method, "POST"))
    {
      struct connection_info_struct *con_info = *con_cls;

      if (*upload_data_size != 0)
        {
          MHD_post_process (con_info->postprocessor, upload_data,
                            *upload_data_size);
          *upload_data_size = 0;

          return MHD_YES;
        }
      else if (NULL != con_info->answerstring)
        return send_page (connection, con_info->answerstring);
    }
...

答案 1 :(得分:2)

我遇到了同样的问题,并通过调试发现了解决方案。

当库使用request_data调用处理程序时,不允许您排队任何响应(MHD_queue_response返回MHD_NO)。您需要等到没有request_data的最终处理程序调用才能调用MHD_queue_response

据我所知,这种行为没有得到记录。