3

我正在编写一个使用 Casablanca REST API 的本机 Windows C++ 应用程序。我正在尝试将整数值从 C++ 应用程序传递到将在云中运行的 Java servlet。在进行GETREST 调用时,Casablanca API 要求我使用 anstd::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++ 建议都将在此不胜感激。

4

2 回答 2

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;
    });
}
于 2015-07-01T13:08:58.263 回答
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());
    });
}
于 2015-07-01T16:05:34.123 回答