GSOAP對Header的支持遠沒有其站點說的那么好,當然如果WSDL描述的嚴密,其工具會自動生成相應的Header處理代碼,但如果WSDL寫的不好,需要人為添加對Header的處理,那寫起來就是災難~
??? 經(jīng)過四處查找資料,隨意踩著前人的肩膀,終于形成了如下的代碼,供大家來踩~
??? 對SOAPHeader定義的改正,添加所需數(shù)據(jù):
#ifndef?SOAP_TYPE_SOAP_ENV__Header
#define?SOAP_TYPE_SOAP_ENV__Header?(86)
/*?SOAP?Header:?*/
struct?SOAP_ENV__Header
{
#ifdef?WITH_NOEMPTYSTRUCT
private:
????char?dummy;????/*?dummy?member?to?enable?compilation?*/
#endif
public:
????mms2__RequestSOAPHeader*?requestHeader;
????mms2__NotifySOAPHeader*?notifyHeader;
};
#endif
??? 添加SOAPHeader的in函數(shù)處理:
SOAP_FMAC3?struct?SOAP_ENV__Header?*?SOAP_FMAC4?soap_in_SOAP_ENV__Header(struct?soap?*soap,?const?char?*tag,?struct?SOAP_ENV__Header?*a,?const?char?*type)
{
????if?(soap_element_begin_in(soap,?tag,?0,?type))
????????return?NULL;
????a?=?(struct?SOAP_ENV__Header?*)soap_id_enter(soap,?soap->id,?a,?SOAP_TYPE_SOAP_ENV__Header,?sizeof(struct?SOAP_ENV__Header),?0,?NULL,?NULL,?NULL);
????if?(!a)
????????return?NULL;
????soap_default_SOAP_ENV__Header(soap,?a);
????int?notifyheader?=?1;
????int?requestheader?=?1;
????if?(soap->body?&&?!*soap->href)
????{
????????for?(;;)
????????{????soap->error?=?SOAP_TAG_MISMATCH;
????????????if?(soap->error?==?SOAP_TAG_MISMATCH)
????????????{
????????????????if(notifyheader?==?1)
????????????????{
????????????????????a->notifyHeader?=?soap_in_mms2__NotifySOAPHeader(soap,?"mms2:NotifySOAPHeader",?a->notifyHeader,?"");
????????????????????if(a->notifyHeader)
????????????????????{
????????????????????????notifyheader?=?0;
????????????????????????continue;
????????????????????}
????????????????}
????????????????else?if(requestheader?==?1)
????????????????{
????????????????????a->requestHeader?=?soap_in_mms2__RequestSOAPHeader(soap,?"mms2:RequestSOAPHeader",?a->requestHeader,?"");
????????????????????if(a->requestHeader)
????????????????????{
????????????????????????requestheader?=?0;
????????????????????????continue;
????????????????????}
????????????????}
????????????????soap->error?=?soap_ignore_element(soap);
????????????}
????????????if?(soap->error?==?SOAP_NO_TAG)
????????????????break;
????????????if?(soap->error)
????????????????return?NULL;
????????}
????????if?(soap_element_end_in(soap,?tag))
????????????return?NULL;
????}
????else
????{????a?=?(struct?SOAP_ENV__Header?*)soap_id_forward(soap,?soap->href,?(void*)a,?0,?SOAP_TYPE_SOAP_ENV__Header,?0,?sizeof(struct?SOAP_ENV__Header),?0,?NULL);
????????if?(soap->body?&&?soap_element_end_in(soap,?tag))
????????????return?NULL;
????}
????return?a;
}
??? 添加SOAPHeader的out函數(shù)處理:
SOAP_FMAC3?int?SOAP_FMAC4?soap_out_SOAP_ENV__Header(struct?soap?*soap,?const?char?*tag,?int?id,?const?struct?SOAP_ENV__Header?*a,?const?char?*type)
{
????if?(soap_element_begin_out(soap,?tag,?soap_embedded_id(soap,?id,?a,?SOAP_TYPE_SOAP_ENV__Header),?type))
????????return?soap->error;
????if(a?!=?NULL)
????{
????????if(a->requestHeader?!=?NULL)
????????????a->requestHeader->soap_out(soap,?"mms2:RequestSOAPHeader",?-1,?"");
????????else?if(a->notifyHeader?!=?NULL)
????????????a->notifyHeader->soap_out(soap,?"mms2:NotifySOAPHeader",?-1,?"");
????}
????return?soap_element_end_out(soap,?tag);
}
??? 并不確認上面的代碼是否還有什么錯誤,還沒有來得及仔細測試,就來了一次request調(diào)用,所需數(shù)據(jù)正常到達,就已經(jīng)19:50了,只能下班回家了~現(xiàn)在GSOAP還有兩個主要問題:MIME附件和SOAPFault的處理。
??? 熟悉GSOAP和使用的WSDL的應該很好理解上面的代碼,不熟悉這個WSDL的,麻煩多猜猜了,這個WSDL雖然不是什么絕密,但BOSS跟人簽了“保密”協(xié)議,這里就不亂說了,省的留下把柄~
???