1

我写了一个 c 程序,它需要一个接口来连接其他程序,也需要一个 webste。所以我只是选择了libcs​​oap来创建一个soap接口。libcs​​oap 库基于 nanohttpd,这是一个用 c 编写的小型 http 服务器。

我刚刚实现了一些测试函数,例如一个ping只返回一个没有任何有趣数据的 xml 的函数。

我可以在 libcs​​oap 的帮助下毫无问题地调用这些函数。但是现在,我尝试从一个虚拟网站调用肥皂接口。我刚刚创建了一个带有 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>

我使用铬来调试代码。可以观察所有http请求,我总是得到http状态200作为答案。所以......请求应该是完整的?如果我检查服务器端的日志(libcs​​oap-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 控制台中的 chromium 中,我总是得到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:

错误:使用 JQuery 的 ajax 方法加载 XML 文件时,“Access-Control-Allow-Origin 不允许 Origin null”

XmlHttpRequest 错误:Access-Control-Allow-Origin 不允许 Origin null

Access-Control-Allow-Origin 不允许 Origin null

$.ajax(): Origin null 是不允许的

将 jQuery Post 发送到 Google API 的 Access-Control-Allow-Origin 错误

...

也许有人可以看到我做错了什么?

感谢您的帮助。

此致

- 编辑 -

我只是在 php 中写了一个小“代理”。它只是接收 xml 并将其发送到 localhost:10000,然后返回 xml-answer。现在我使用 xml 的后字段数据。

这是php文件:

<?php
echo shell_exec('curl http://localhost:10000/tbs_lgrow -m60 -d' . escapeshellarg($_POST['data']));
?>

现在它适用于这个小技巧。

谢谢

此致

4

0 回答 0