我想将从FindItemResponse收到的ItemID传递给GetItemRequest,以便从Exchange邮箱获取邮件。
EWS托管API(针对C#,。Net)中有一个Bind
方法,用于传递该ItemID,但我正在使用C ++和Exchange Web服务(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;
}
但是此代码会在评论Segmentation fault
上提供/*Set the itemID of the desired item to retrieve from FindItem*/
,但是当我删除该代码ItmID->Id = messgT[0].ItemId->Id;
时,它就会成功运行。
所以我想知道是否有一种方法可以通过代码从findItem Response XML中提取itemId,以便在getItem请求中传递该id,以便对该数据进行加密,因为EWS中没有Bind
方法(SOAP) 。因为在findItem Response消息中
我的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请求给出401 Unauthorized。有关我的更多信息,我也发布了该查询Here
请帮助解决此问题。非常感谢。
已解决UPDATE问题。在“答案”部分中部分解决了细分错误,但发生了ErrorInvalidIdEmpty
错误,请将我的答案视为问题。
答案 0 :(得分:0)
不知怎的,我已经通过将messgID
作为字符串
std::string messgID;
ns1__MessageType* messgT = new ns1__MessageType();
messgT->ItemId = new ns1__ItemIdType();
messgID = messgT->ItemId->Id;
并将其直接分配给getItem请求标识
//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存在)。
请帮帮我。谢谢。