我需要编写一个完整的http请求来调用SOAP服务。我没有soap请求库,所以我需要编写完整的HTTP数据包。这就是我的进展方式(我正在编写一个arduino板):
String body = HttpRequestBody("33", "77%");
client.println("POST /dataserver HTTP/1.1");
client.println("Accept: text/xml, multipart/related");
client.println("Content-Type: text/xml; charset=utf-8");
client.println("SOAPAction: \"http://example.com/Functions/SendDataRequest\"");
client.println("User-Agent: Arduino WiFiShield");
client.println("Content-Length: "+body.length());
client.println("Host: arduino-data-server.appspot.com/dataserver");
client.println("Connection: Keep-Alive");
client.println();
client.println(body);
客户端表示与我的webservice的连接。这是HttpRequestBody函数:
String HttpRequestBody(String v1, String v2) {
Serial.println("Generating xml message...");
String res = "";
res += "<?xml version=\"1.0\"?>\n\r";
res +="<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"\n\r";
res +="<S:Body>\n\r";
res +="<ns2:sendData xmlsn:ns2=\"http://example.com\">\n\r";
res +="<arg0>"+v1+"</arg0>\n\r";
res +="<arg1>"+v2+"</arg1>\n\r";
res +="</ns2:sendData>\n\r";
res +="</S:Body>\n\r";
res +="</S:Envelope>\n\r";
Serial.println(res);
return res;
}
但出了问题,我无法联系网络服务器。 Web服务器工作,它是可访问的,因为如果我将POST更改为GET,在webservice日志上,我看到连接。我该如何解决?
答案 0 :(得分:1)
在HttpRequestBody中,您正在分配:String res = "";
,然后更新它。最后,您返回res
。但是,res
是在HttpRequestBody(??)的堆栈上分配的,你是 NOT 保证它会在HttpRequestbody终止后存在。
你可能需要在C代码中使用C ++等效的malloc,以确保res在堆上并且不会被释放。