我写了一个c程序,它需要一个其他程序的接口,也需要一个webste。所以我选择了libcsoap来创建一个soap接口。 libcsoap-library基于nanohttpd,这是一个用c编写的小型http服务器。
我刚刚实现了一些测试功能,例如一个ping
- 函数只返回一个没有任何有趣数据的xml。
我可以在libcsoap的帮助下调用这些函数而不会出现任何问题。但现在,我尝试从虚拟网站调用soap接口。我刚创建了一个带有textarea的html文件和一个按钮,将textarea的内容作为原始xml发送。
然后我尝试将答案放入div
- 按钮旁边的send
。这个html文件位于我的本地机器xubuntu-02
上的apache2网络服务器上。
以下是代码:
<HTML xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<HEAD>
<TITLE>Debug Post</TITLE>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function submit_data() {
var src = document.getElementById('data');
$.support.cors = true;
$.ajax({
url: 'http://xubuntu-02:10000/tbs_blabla',
type: 'POST',
async: false,
timeout: 30000,
data: src.value,
success: function(data) {
alert('OK!');
/*document.getElementById('data').value = data;*/
},
fail: function() {
alert('failed');
}
});
}
</script>
</HEAD>
<BODY>
<H1>Debug Post</H1>
<textarea id="data" rows="10" cols="80">
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <m:ping xmlns:m="urn:tbs_blabla"> <m:name xsi:type="xsd:string">Jonny B. Good</m:name></m:ping> </SOAP-ENV:Body></SOAP-ENV:Envelope>
</textarea>
<p>
<input type="button" value="Submit" onclick="submit_data();return false;" />
</p>
<p>
<div id="res">
</div>
</p>
</BODY>
</HTML>
我使用chrome来调试代码。可以观察所有的http请求,我总是得到http状态200的答案。那么......请求应该完整吗?如果我检查服务器端的日志(libcsoap-log),我也可以看到xml已经处理,创建了一个新的xml并发送了新的xml。
我还用wireshark检查了请求,似乎没问题:
POST /tbs_blabla HTTP/1.1
Host: xubuntu-02:10000
Connection: keep-alive
Content-Length: 425
Accept: */*
Origin: http://xubuntu-02
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://xubuntu-02/test.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
DNT: 1
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <m:ping xmlns:m="urn:tbs_blabla"> <m:name xsi:type="xsd:string">Jonny B. Good</m:name></m:ping> </SOAP-ENV:Body></SOAP-ENV:Envelope>
HTTP/1.1 200 OK
Date: Sun, 10 Mar 2013 13:28:33 GMT
Server: Nano HTTPD library
Content-Type: text/xml
Content-Length: 417
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <m:pingResponse xmlns:m="urn:tbs_blabla"> <m:ok xsi:type="xsd:boolean">true</m:ok></m:pingResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>
所以,一切看起来都不错,但在javascript控制台的chrome中,我总是得到XMLHttpRequest cannot load http://xubuntu-02:10000/tbs_blabla. Origin http://xubuntu-02 is not allowed by Access-Control-Allow-Origin.
。
总是我发送请求,网页上没有任何反应。
我不知道为什么。我测试了很多东西。例如。使用chromium-browser --disable-web-security
或chromium-browser --allow-file-access-from-files
启动铬。
我查了很多stackoverflow-posts:
XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin
Origin null is not allowed by Access-Control-Allow-Origin
$.ajax(): Origin null is not allowed
Access-Control-Allow-Origin error sending a jQuery Post to Google API's
...
也许有人能看出我做错了什么?
感谢您的帮助。
祝你好运
- 编辑 -
我刚在php中写了一个小'代理'。它只是接收xml将它发送到localhost:10000然后它返回xml-answer。现在我使用xml的post-field数据。
这是php文件:
<?php
echo shell_exec('curl http://localhost:10000/tbs_lgrow -m60 -d' . escapeshellarg($_POST['data']));
?>
现在它适用于这个小黑客。
由于
祝你好运