6#include <QtCore/QJsonDocument>
7#include <QtCore/QJsonObject>
10#include <imtrest/CHttpServletCompBase.h>
11#include <imtrest/IProtocolEngine.h>
18class CSdlJsonServletBaseComp:
public imtrest::CHttpServletCompBase
21 typedef imtrest::CHttpServletCompBase BaseClass;
22 typedef QSharedPointer<imtrest::IResponse> ResponsePtr;
24 I_BEGIN_BASE_COMPONENT(CSdlJsonServletBaseComp)
28 template <
class SdlClass>
29 bool ReadRequestToSdlStruct(
31 const imtrest::CHttpRequest& request,
32 ResponsePtr& response)
const;
34 template <
class SdlClass>
35 bool CreateResponseFromSdlStruct(
36 const SdlClass& input,
37 const imtrest::CHttpRequest& request,
39 ResponsePtr& response,
40 QJsonDocument::JsonFormat jsonFormat = QJsonDocument::Compact)
const;
43 virtual ResponsePtr CreateDefaultErrorResponse(
45 const QString& errorString,
46 const QString& additionalInfo,
48 const imtrest::CHttpRequest& request)
const;
54template<
class SdlClass>
55bool CSdlJsonServletBaseComp::ReadRequestToSdlStruct(
57 const CHttpRequest& request,
58 ResponsePtr& responsePtr)
const
60 const QByteArray requestBody = request.GetBody();
61 const QJsonDocument payloadDocument = QJsonDocument::fromJson(requestBody);
62 if (!payloadDocument.isObject()){
63 const QString baseErrorString = QT_TR_NOOP(
"The request is not a valid json object");
64 SendErrorMessage(0, baseErrorString + QString(
": '%1'").arg(QString(requestBody)), __func__);
66 responsePtr = CreateDefaultErrorResponse(
70 imtrest::IProtocolEngine::SC_BAD_REQUEST,
76 const QJsonObject payloadObject = payloadDocument.object();
77 const bool isCreated = SdlClass::ReadFromJsonObject(out, payloadObject);
79 const QString baseErrorString = QT_TR_NOOP(
"The request does not match the scheme");
80 SendErrorMessage(0, baseErrorString + QString(
": '%1'").arg(QString(requestBody)), __func__);
81 responsePtr = CreateDefaultErrorResponse(
85 imtrest::IProtocolEngine::SC_BAD_REQUEST,
95template <
class SdlClass>
96bool CSdlJsonServletBaseComp::CreateResponseFromSdlStruct(
97 const SdlClass& input,
98 const imtrest::CHttpRequest& request,
100 ResponsePtr& responsePtr,
101 QJsonDocument::JsonFormat jsonFormat)
const
103 QJsonObject replyJson;
104 const bool isAdded = input.WriteToJsonObject(replyJson);
106 QString baseErrorString = QT_TR_NOOP(
"Unable to convert reply to json");
107 SendCriticalMessage(0, baseErrorString, __func__);
108 Q_ASSERT_X(
false, __func__, baseErrorString.toLocal8Bit());
110 responsePtr = CreateDefaultErrorResponse(
114 imtrest::IProtocolEngine::SC_INTERNAL_SERVER_ERROR,
120 QByteArray replyPayload = QJsonDocument(replyJson).toJson(jsonFormat);
121 responsePtr.reset(request.GetProtocolEngine().CreateResponse(
125 QByteArray(
"application/json; charset=utf-8")).PopInterfacePtr());