c++ 通过系统在shell中运行curl

Das*_*ffe 0 c++ shell curl

如果我在 shell 中写下这个,一切都会像魅力一样工作:

// shell (unix)
curl -X PUT -d "{ \"string\" : \"my string 1212 \"}" "https://my.firebaseio.com/myVal.json"
Run Code Online (Sandbox Code Playgroud)

如您所知,这会在我的firebase. 如上所述,这按预期工作。由于我对 C++ 不太了解,所以我不知道如何curl在内部 PUT -requests。我正在考虑通过在 shell 中执行此操作system

我最终得到了这个:

// c++ code
system('curl -X PUT -d "{ \"string\" : \"my string 1212 \"}" "https://my.firebaseio.com/myVal.json" ');
Run Code Online (Sandbox Code Playgroud)

然而,这会产生以下输出:

curl: (6) Could not resolve host: 
curl: (6) Could not resolve host: CD
curl: (7) Could not resolve host: CD
curl: (3) [globbing] unmatched close brace/bracket in column 1
Run Code Online (Sandbox Code Playgroud)

感谢您提供任何有用的建议

// 更新1

在听说单引号'是为字符保留的并采用 erip 提供的解决方案后,它仍然是相同的输出:

curl: (6) Could not resolve host: 
curl: (6) Could not resolve host: cd
curl: (7) Could not resolve host: cd
curl: (3) [globbing] unmatched close brace/bracket in column 1
{
   "error" : "Invalid data; couldn't parse JSON object, array, or value. Perhaps you're using invalid characters in your key names."
}
Run Code Online (Sandbox Code Playgroud)

eri*_*rip 5

在 C++ 中,单引号用于类型char。双引号保留用于std::strings 或char *s。

因此,您的解决方案应该是简单地将单引号替换为双引号,并转义不是最终引号的引号:

system("curl -X PUT -d \"{ \"string\" : \"my string 1212 \"}\" https://my.firebaseio.com/myVal.json ");
Run Code Online (Sandbox Code Playgroud)

但是,就像 @DaoWen 提到的那样,如果可能的话,请始终使用库。

编辑

我建议尝试这个:

std::string command = "curl -X PUT -d \"{ \"string\" : \"my string 1212 \"}\" https://my.firebaseio.com/myVal.json ";

system(command.c_str());
Run Code Online (Sandbox Code Playgroud)

但老实说,如果您不想使用 ,那么使用fork和调用比系统调用更好。execlibcurl

编辑2

std::string command = "curl -H \"Content-Type: application/json\" -X PUT -d '{ \"string\" : \"my string 1212 \"}' https://my.firebaseio.com/myVal.json";

system(command.c_str());
Run Code Online (Sandbox Code Playgroud)

奇怪的转义引号将 key: "string" 视为主机,因为它{被引号包围,充当数据。我通过用单引号将要传递的数据引起来解决了这个问题。

您可以在此处看到我PUT { "Hello" : "World!" }对您的应用程序的了解。

希望这有帮助。