curl PUT JSON 正文在处理数组时出现问题

curl PUT JSON body having issues processing array's

我正在开发一个与 REST API 通信的库。到目前为止,我为 PUT 调用编写的方法一直有效。

void Command::put(const std::string url, const std::string body)
{

  CURLcode ret;
  struct curl_slist *slist1;
  slist1 = NULL;
  // slist1 = curl_slist_append(slist1, "Content-Type: multipart/form-data;");
  slist1 = curl_slist_append(slist1, "Content-Type: application/json;");

  curl = curl_easy_init();
  if(curl)
  {
    curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 102400L);
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)12);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist1);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.79.1");
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
    curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, "/Users/$USER/.ssh/known_hosts");
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, 1L);
    curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);

    ret = curl_easy_perform(curl);

    curl_easy_cleanup(curl);
    curl = NULL;
    curl_slist_free_all(slist1);
    slist1 = NULL;
  }
  curl_easy_cleanup(curl);
  curl = nullptr;
  curl_slist_free_all(slist1);
  slist1 = NULL;
}

但是,它似乎不适用于数组。以下是三个调试放置调用及其输出。前两个工作。第三个没有。

  // *** DEBUG ***
  commandWrapper->put(
    "http://192.168.1.7/api/x1CAh16Nr8NcKwgkUMVbyZX3YKFQrEaMAj5pFz0Z/lights/6/state", "{\"on\":true}");

  commandWrapper->put(
    "http://192.168.1.7/api/x1CAh16Nr8NcKwgkUMVbyZX3YKFQrEaMAj5pFz0Z/lights/6/state", "{\"bri\":123}");

  commandWrapper->put(
    "http://192.168.1.7/api/x1CAh16Nr8NcKwgkUMVbyZX3YKFQrEaMAj5pFz0Z/lights/6/state", "{\"xy\":[0.04,0.98]}");

[{"success":{"/lights/6/state/on":true}}]
[{"success":{"/lights/6/state/bri":123}}]
[{"error":{"type":2,"address":"/lights/6/state","description":"body contains invalid json"}}]2022-04-02T02:56:47.220Z - Living Room 1 - Status: 0

我对如何进行有点迷茫。我验证了这个命令在命令行上确实有效。

您需要更改此行:

curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)12);

改为:

curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)body.size());

或者,完全省略 CURLOPT_POSTFIELDSIZE_LARGE,因为在这种情况下 body.c_str() 是指向 null-terminated 字符串的指针。 curl 可以为您确定大小。

JSON {xy:[0.04,0.98]} 是16个字符,比你声称的12个字符长,所以你在传输过程中截断了 JSON ,这就是为什么服务器认为它是无效的。 {"on":true}{"bri":123} 都是 11 个字符(如果算上空终止符,则为 12 个),因此它们不会被截断。