2

CPPRESTSDK (別名カサブランカ) を使用してデータを RESTful サーバーに POST しようとしています。これを行うには、リクエストを作成し、ヘッダーを割り当てます。

// create request, and add header information
web::http::http_request req(methods::POST);
req.headers().add(header_names::authorization, authStr); // authStr is base64 representation of username & password
req.headers().add(header_names::content_type, http::details::mime_types::application_json);

次に、すべてのキーと値のペアを含む web::json::value オブジェクトを作成します。

web::json::value obj = json::value::object();
obj[U("Key1")] = web::json::value::string(U("Val1")];
obj[U("Key2")] = web::json::value::string(U("Val2")];
obj[U("Key3")] = web::json::value::string(U("Val3")];

次に、次のように呼び出して、このオブジェクトをリクエストの本文に格納します。

req.set_body(obj);

最後に、http_client を使用してサーバーにリクエストを送信します。

// create http client
web::http::client::http_client client(addr); // addr is wstring

return client.request(req).then([](http_response response) {
    return response;
});

問題は、これが何もしないことです。この行にブレークポイントを配置すると、「400 Bad Request」に関する情報が得られます。リクエストの本文の形式が何らかの形で間違っていると思いますが、ヘッダーの情報が欠落している可能性もあります。このエラーは、同じ URL で GET リクエストを発行した場合には発生しないため、特に POST の問題です。どう思いますか?

これが実際の例です:

// create a new channel
pplx::task<web::http::http_response> postChannel(http_client client, std::wstring authStr, std::wstring cDesc, std::wstring cName, std::string cDiagCap, int cNormFloat, int cWriteDuty,
int cWriteMeth, std::string cItemPersist, std::wstring cItemPersistDat) {
// create request
http_request req(methods::POST);
req.headers().add(header_names::authorization, authStr);

std::wstring url = L"/config/v1/project/channels";
req.set_request_uri(url);

json::value obj = json::value::object();
obj[U("common.ALLTYPES_DESCRIPTION")] = json::value::string(cDesc);
obj[U("common.ALLTYPES_NAME")] = json::value::string(cName);
obj[U("servermain.CHANNEL_DIAGNOSTICS_CAPTURE")] = json::value(cDiagCap == "true" || cDiagCap == "t");
obj[U("servermain.CHANNEL_NON_NORMALIZED_FLOATING_POINT_HANDLING")] = json::value(cNormFloat);
obj[U("servermain.CHANNEL_WRITE_OPTIMIZATIONS_DUTY_CYCLE")] = json::value(cWriteDuty);
obj[U("servermain.CHANNEL_WRITE_OPTIMIZATIONS_METHOD")] = json::value(cWriteMeth);
obj[U("servermain.MULTIPLE_TYPES_DEVICE_DRIVER")] = json::value::string(U("Simulator")); // right now, Simulator channels are the only option
obj[U("simulator.CHANNEL_ITEM_PERSISTENCE")] = json::value(cItemPersist == "true" || cItemPersist == "t");
obj[U("simulator.CHANNEL_ITEM_PERSISTENCE_DATA_FILE")] = json::value::string(cItemPersistDat);

req.set_body(obj);

return client.request(req).then([](http_response response) {
    return response;
});

}

4

0 に答える 0