[英]gSOAP EWS: ErrorInvalidIdEmpty error
我想將我從FindItemResponse收到的ItemID傳遞給GetItemRequest,以從交換郵箱中獲取消息。
EWS托管API中有一個Bind
方法(用於C#、. Net),用於傳遞該ItemID,但是我將C ++與Exchange Web Services(SOAP)一起使用。
我的客戶代碼是:
/*FindItem RESPONSE*/
if( proxy->FindItem(findItem, findItemRes) == SOAP_OK){
std::string* messgID = NULL;
ns1__MessageType* messgT = new ns1__MessageType();
messgT->ItemId = new ns1__ItemIdType();
messgID = &messgT->ItemId->Id;
ns1__ArrayOfRealItemsType* realItems = new ns1__ArrayOfRealItemsType();
realItems->__union_ArrayOfRealItemsType = new __ns1__union_ArrayOfRealItemsType();
messgT = realItems->__union_ArrayOfRealItemsType->union_ArrayOfRealItemsType.Message;
ews__FindItemResponseMessageType *firsm = new ews__FindItemResponseMessageType();
firsm->RootFolder = new ns1__FindItemParentType();
firsm->RootFolder->__union_FindItemParentType = 1;
realItems = firsm->RootFolder->union_FindItemParentType.Items;
findItemRes.ews__FindItemResponse = new ews__FindItemResponseType();
findItemRes.ews__FindItemResponse->ResponseMessages = new ews__ArrayOfResponseMessagesType();
findItemRes.ews__FindItemResponse->ResponseMessages->__union_ArrayOfResponseMessagesType = new __ews__union_ArrayOfResponseMessagesType();
findItemRes.ews__FindItemResponse->ResponseMessages->__union_ArrayOfResponseMessagesType->__union_ArrayOfResponseMessagesType = 2;
firsm = findItemRes.ews__FindItemResponse->ResponseMessages->__union_ArrayOfResponseMessagesType->union_ArrayOfResponseMessagesType.FindItemResponseMessage;
/*GetItem REQUEST*/
ews__GetItemType* getItem = new ews__GetItemType();
getItem->ItemShape = new ns1__ItemResponseShapeType();
getItem->ItemShape->BaseShape = ns1__DefaultShapeNamesType__IdOnly;
//get the ItemId from FindItem
ns1__ItemIdType* ItmID = new ns1__ItemIdType();
ItmID->Id = messgT[0].ItemId->Id; /*Set the itemID of the desired item to retrieve from FindItem*/
getItem->ItemIds = new ns1__NonEmptyArrayOfBaseItemIdsType();
getItem->ItemIds->__size_NonEmptyArrayOfBaseItemIdsType = 1;
getItem->ItemIds->__union_NonEmptyArrayOfBaseItemIdsType = new __ns1__union_NonEmptyArrayOfBaseItemIdsType();
getItem->ItemIds->__union_NonEmptyArrayOfBaseItemIdsType->__union_NonEmptyArrayOfBaseItemIdsType = 2;
getItem->ItemIds->__union_NonEmptyArrayOfBaseItemIdsType->union_NonEmptyArrayOfBaseItemIdsType.ItemId = ItmID;
}
但是,此代碼在注釋/*Set the itemID of the desired item to retrieve from FindItem*/
給出Segmentation fault
,但是當我刪除該代碼時, ItmID->Id = messgT[0].ItemId->Id;
然后它成功運行。
所以我想知道是否有一種方法可以通過代碼從findItem響應XML中提取itemId,以在getItem請求中傳遞該ID來對消息數據進行加注,因為EWS(SOAP)中沒有Bind
方法。 由於在findItem響應消息中,我具有如下的itemID
<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder TotalItemsInView="2" IncludesLastItemInRange="true">
<t:Items>
<t:Message>
<t:ItemId Id="edAQAfAGNvZGV1aWJAY29kZXVpYi5vb" ChangeKey="CQAAABAAAAAWl"/>
</t:Message>
<t:Message>
<t:ItemId Id="tNFedAQAfAGNvZGV1aWJAYHYIO88OUA" ChangeKey="CQAAAAAAWT"/>
</t:Message>
</t:Items>
</m:RootFolder>
</m:FindItemResponseMessage>
</m:ResponseMessages>
但是如何從這里提取那個itemId? 任何想法? 謝謝。
更新:
當我手動傳遞ItemID時,如下所示
ns1__ItemIdType* ItmID = new ns1__ItemIdType();
/*Set the itemID of the desired item to retrieve from FindItem*/
ItmID[0].Id = "edAQAfAGNvZGV1aWJAY29kZXVpYi5vb";
然后,findItem響應給出200(OK)http狀態,而getItem Request給出401未經授權。 有關此的更多信息,我也在此處發布了該查詢
請幫助解決此問題。 許多人預先表示感謝。
UPDATE問題已解決。 細分錯誤已在“答案”部分得到部分解決,但發生ErrorInvalidIdEmpty
錯誤,請參閱“我的答案”為問題。
我以某種方式通過將messgID
作為字符串來messgID
代碼中的更改,從而部分解決了此問題
std::string messgID;
ns1__MessageType* messgT = new ns1__MessageType();
messgT->ItemId = new ns1__ItemIdType();
messgID = messgT->ItemId->Id;
並將其直接分配給getItem請求ID
//get the ItemId from FindItem
ns1__ItemIdType* ItmID = new ns1__ItemIdType();
ItmID->Id = messgID;
但是現在的問題是,該Id
為空( ErrorInvalidIdEmpty
),這意味着該ID必須為非空。
因此,我認為問題出在FindItem Response對象(將XML反序列化為C ++)中,現在熟悉gSoap的任何人都可以幫助我找出此問題。 據我說,可能是以下問題:
注意:由於findItem響應的XML響應(意味着存在ItemIds)如上述XML所示。
請幫我。 謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.