我正在编写一个使用Casablanca REST API的本机Windows C ++应用程序。我试图将一个整数值从C ++应用程序传递到将在云中运行的Java servlet。在进行GET
REST调用时,Casablanca API希望我使用std::u32string
来存储查询参数。对我来说有点直观,为什么要使用UTF-32编码来确保可以支持每种类型的字符。对我来说不直观的是如何进行这种转换。
这是我目前的代码:
__int64 queryID = 12345689; // the integer to pass
std::stringstream stream;
stream << queryID;
std::string queryID_utf8(stream.str()); // the integer as a UTF-8 string
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> convert;
std::u32string queryID_utf32 = convert.from_bytes(queryID_utf8); // UTF-32 string
http_client client(U("http://localhost:8080/MyJavaWebApp"));
uri_builder builder(U("/getContent"));
builder.append_query(U("queryID"), queryID_utf32.c_str());
client.request(methods::GET, builder.to_string()) // etc.
我收到这个UTF-32编码字符串后,我也不完全确定如何处理Java端的事情。这里将非常感谢任何专家C ++建议。
答案 0 :(得分:1)
当我在C ++中使用Casablanca时,我使用了wchar
和swprintf
等。
pplx::task<MPS_Request::ProcessResult*> MPS_Request::ProcessCreate (ProcessResult * processData)
{
http_request request (methods::GET);
request.set_request_uri (L"?format=xml&action=query&titles=Main%20Page&prop=revisions&rvprop=content");
http_client client (L"http://en.wikipedia.org/w/api.php");
// Make the request and asynchronously process the response
return client.request (request).then ([processData](http_response response)
{
// Grab the status code
processData->statusCodeTSG = response.status_code ();
if (processData->statusCodeTSG == HTTP_RET_OK)
{
// Read the stream into a string
auto bodyStream = response.body ();
container_buffer<string> stringBuffer;
bodyStream.read_to_end (stringBuffer).then ([stringBuffer, processData](size_t bytesRead)
{
// Allocate and copy
const string &line = stringBuffer.collection ();
const char * output = line.c_str ();
processData->resultStreamTSG = new char [strlen (output) + 1];
strcpy_s (processData->resultStreamTSG, (strlen (output) + 1), output);
})
.wait ();
}
return processData;
});
}
答案 1 :(得分:0)
我最终使用swprintf
,正如@ CharlieScott-Skinner在他深思熟虑的答案中正确建议的那样。这里的诀窍是使用格式参数%I64u
来确保正确处理__int64
。
作为一般性评论,请注意,这更像是一种解决此问题的C风格方法,而不是使用C ++ string
类。话虽如此,string
课程的创建是为了让我们的生活更轻松,如果有用例没有帮助,那么我们应该可以自由尝试其他事情。
__int64 queryID = 9223372036854775807; // largest supported value
wchar_t query_buffer[30]; // give enough space for largest
swprintf(query_buffer, 30, L"%I64u", queryID); // possible value
web::json::value result = RestDownload(query_buffer); // call helper function
// my helper method returns JSON which is then processed elsewhere
pplx::task<json::value> RestDownload(const wchar_t* queryID) {
http_client client(U("http://localhost:8080/MyJavaWebApp"));
uri_builder builder(U("/getContent"));
builder.append_query(U("queryID"), queryID); // this is OK
return client.request(methods::GET, builder.to_string()).then([](http_response response) {
if (response.status_code() == status_codes::OK) {
return response.extract_json();
}
// Handle error cases, for now return empty json value...
return pplx::task_from_result(json::value());
});
}