#c #soap #salesforce #gsoap
#c #soap #salesforce #gsoap
Вопрос:
Я пытаюсь использовать gSOAP в клиенте c для доступа к salesforce.com API, использующий приведенный ниже код:
struct soap soap;
soap_init(amp;soap);
_ns1__login loginReq;
_ns1__loginResponse loginRes;
loginReq.username = "XXXX";
loginReq.password = "XXXX";
if(soap_call___ns1__login(amp;soap,NULL,NULL,amp;loginReq,amp;loginRes) == 0){
qDebug() << loginRes.result->sessionId;
} else {
soap_print_fault(amp;soap, stderr);
soap_print_fault_location(amp;soap, stderr);
}
Это выполняется без проблем, но при запуске выдает следующую ошибку:
SOAP 1.1 fault: SOAP-ENV:Client [no subcode]
"Validation constraint violation: tag name or namespace mismatch in element <soapenv:Envelope>"
Detail: [no detail]
HTTP/1.1 500 Internal Server Error
Server:
Content-Type: text/xml; charset=UTF-8
Content-Length: 625
Date: Fri, 29 Apr 2011 00:56:17 GMT
Connection: close
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="urn:fault.enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><soapenv:Fault><faultcode>UNKNOWN_EXCEPTION</faultcode><faultstring>UNKNOWN_EXCEPTION: Premature end of file.</faultstring><detail><sf:UnexpectedErrorFault xsi:type="sf:UnexpectedErrorFault"><sf:exceptionCode>UNKNOWN_EXCEPTION</sf:exceptionCode><sf:exceptionMessage>Premature end of file.</sf:exceptionMessage></sf:UnexpectedErrorFault></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>
<!-- ** HERE ** -->
Я запустил сбор пакетов, и все выглядит правильно, за исключением того, что ‘Длина содержимого’ в заголовке HTTP показывает 0:
POST /services/Soap/c/21.0 HTTP/1.1
Host: login.salesforce.com
User-Agent: gSOAP/2.7
Content-Type: text/xml; charset=utf-8
Content-Length: 0
Connection: close
SOAPAction: ""
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="urn:sobject.enterprise.soap.sforce.com" xmlns:ns3="urn:fault.enterprise.soap.sforce.com" xmlns:ns1="urn:enterprise.soap.sforce.com"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><ns1:login><ns1:username>XXXX</ns1:username><ns1:password>XXXX</ns1:password></ns1:login></SOAP-ENV:Body></SOAP-ENV:Envelope>
Если у кого-нибудь есть какие-либо идеи о том, где я ошибаюсь, это было бы очень ценно.
Я использую gSOAP 2.7 в Debian 6.0, используя g 4.4.5 для компиляции, если это поможет.
Комментарии:
1. Это может показаться странным, но я пытаюсь найти ключ к работе с VC , gSOAP и salesforce.com . Не хотели бы вы показать мне некоторые документы, если не возражаете?
Ответ №1:
Это очень старый вопрос, но недавно у меня была такая же проблема. Проблема для меня заключалась в том, что я смешивал код c и c-код. Я бы скомпилировал stdsoap2.c вместо stdsoap2.cpp и по какой-то причине это помешало правильному подсчету длины содержимого. Как только я создал правильный объект и повторно связался с ним, решение сработало идеально
Ответ №2:
Из предоставленного вами метода захвата пакетов следует отметить еще один ключевой момент. Поле SOAPAction пустое.
Вот пример захвата пакета моего приложения:
POST /ws/smi/v1/IndexService HTTP/1.1
Host: somevalidwebservice.com
User-Agent: gSOAP/2.8
Content-Type: text/xml; charset=utf-8
Content-Length: 1180
Connection: close
SOAPAction: "http://www.somevalidwebservice.com/ws/smi/v1/getIndex"
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://www.somevalidwebservice.com/ws/smi/v1"
<SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body><nsGlobal:getIndexRequest></nsGlobal:getIndexRequest>
Можете ли вы проверить, правильно ли вы указали параметр действия SOAP?
Комментарии:
1. SOAPAction может быть пустым; См. w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528
2. Я скопировал свой захват пакета, вручную изменил длину содержимого и отправил его на сервер с помощью socat. Это вернуло ожидаемый ответ обратно, поэтому я думаю, можно с уверенностью предположить, что проблема связана только с поданным заголовком content-length.