写完整的HTTP POST请求包

时间:2013-10-06 14:44:08

标签: web-services soap arduino http-post

我需要编写一个完整的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日志上,我看到连接。我该如何解决?

1 个答案:

答案 0 :(得分:1)

在HttpRequestBody中,您正在分配:String res = "";,然后更新它。最后,您返回res。但是,res是在HttpRequestBody(??)的堆栈上分配的,你是 NOT 保证它会在HttpRequestbody终止后存在。

你可能需要在C代码中使用C ++等效的malloc,以确保res在堆上并且不会被释放。