You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.4 KiB
C++
94 lines
2.4 KiB
C++
![]()
8 years ago
|
#include "demo/calculator.h"
|
||
|
|
||
|
#include <iostream>
|
||
|
#include "pugixml/pugixml.hpp"
|
||
|
#include "csoap/csoap.h"
|
||
|
|
||
|
namespace demo {
|
||
|
|
||
|
Calculator::Calculator() {
|
||
|
Init();
|
||
|
}
|
||
|
|
||
|
bool Calculator::Add(float x, float y, float* result) {
|
||
|
csoap::Parameter parameters[] = {
|
||
|
{ "x", x },
|
||
|
{ "y", y }
|
||
|
};
|
||
|
|
||
|
std::string result_str;
|
||
|
if (!Call("add", parameters, 2, &result_str)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
*result = boost::lexical_cast<float>(result_str);
|
||
|
} catch (boost::bad_lexical_cast&) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void Calculator::Init() {
|
||
|
soap_envelope_ns_ = { "soapenv", "http://schemas.xmlsoap.org/soap/envelope/" };
|
||
|
service_ns_ = { "ser", "http://www.parasoft.com/wsdl/calculator/" };
|
||
|
|
||
|
host_ = "ws1.parasoft.com";
|
||
|
port_ = ""; // Use default: 80
|
||
|
}
|
||
|
|
||
|
bool Calculator::Call(const std::string& operation,
|
||
|
const csoap::Parameter* parameters,
|
||
|
size_t count,
|
||
|
std::string* result) {
|
||
|
csoap::SoapRequestEnvelope req_envelope(operation);
|
||
|
|
||
|
req_envelope.SetNamespace(csoap::SoapRequestEnvelope::kSoapEnvelopeNS, soap_envelope_ns_);
|
||
|
req_envelope.SetNamespace(csoap::SoapRequestEnvelope::kServiceNS, service_ns_);
|
||
|
|
||
|
for (size_t i = 0; i < count; ++i) {
|
||
|
req_envelope.AddParameter(parameters[i]);
|
||
|
}
|
||
|
|
||
|
std::string request_body;
|
||
|
req_envelope.ToXmlString(&request_body);
|
||
|
|
||
|
csoap::HttpRequest http_request(csoap::kHttpV11);
|
||
|
|
||
|
http_request.set_uri("http://ws1.parasoft.com/glue/calculator");
|
||
|
http_request.set_content_type("text/xml; charset=utf-8");
|
||
|
http_request.set_content_length(request_body.size());
|
||
|
http_request.set_host(host_, port_);
|
||
|
http_request.set_keep_alive(true);
|
||
|
|
||
|
http_request.set_soap_action(operation);
|
||
|
|
||
|
csoap::HttpClient http_client;
|
||
|
|
||
|
if (!http_client.SendRequest(http_request, request_body)) {
|
||
|
std::cerr << "Failed to send HTTP request." << std::endl;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
const csoap::HttpResponse& http_response = http_client.response();
|
||
|
|
||
|
std::cout << http_response.status() << " " << http_response.reason() << std::endl;
|
||
|
|
||
|
csoap::SoapResponseParser soap_response_parser;
|
||
|
|
||
|
std::string rsp_message_name = operation + "Response";
|
||
|
std::string rsp_element_name = "Result";
|
||
|
|
||
|
soap_response_parser.Parse(http_response.content(),
|
||
|
rsp_message_name,
|
||
|
rsp_element_name,
|
||
|
result);
|
||
|
|
||
|
//std::cout << "return:\n" << *result << std::endl;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
} // namespace demo
|