如何在没有基本URL的情况下从JavaScript发送请求?

时间:2014-09-09 19:24:54

标签: javascript jquery ajax sap

我想从我的JavaScript发送一个简单网址请求,以便不会将基本网址添加到请求网址中。例如,请求应发送到以下网址(没有基本网址): SAPEVENT:SOME_TEXT?2

我使用了jQuery的$.ajax函数来实现它,但没有成功。

这是一个JSFiddle: http://jsfiddle.net/txb6tdjj/2/

JS代码:

function sendEvent(id) {
    $.ajax("SAPEVENT:SOME_TEXT?" + id);
}    
sendEvent(2);

我在JS控制台中看到以下错误:

  

XMLHttpRequest无法加载sapevent:SOME_TEXT?2。交叉原始请求   仅支持HTTP。 (jquery的-2.1.0.js:8556)

我甚至设置了参数crossDomain: true,但它没有帮助: http://jsfiddle.net/auhx2v2v/3/

JS代码:

function sendEvent(id) {
    $.ajax({
        url: "SAPEVENT:SOME_TEXT?" + id,
        crossDomain: true
    });
}
sendEvent(2);

最终会出现同样的错误。

它在HTML中正常工作如下: http://jsfiddle.net/1f6npcn2/2/

正常运行的HTML代码

<FORM action="SAPEVENT:PRESS_ME">
    <A HREF="SAPEVENT:CLICK_ON_ME">Click on me to send an event!</A> 
    <INPUT TYPE="submit" VALUE="Press me to send an event!"/>
</FORM>

但我需要在JavaScript 中实现它,以便可以在JavaScript中的URL中动态设置请求参数。 您是否知道如何在JS中实现它,以便将请求发送到没有基本网址的网址SAPEVENT:SOME_TEXT?2

有关使用过的浏览器的其他信息:该错误仅在Chrome中显示。 IE和Firefox没有显示错误,但他们也没有发送请求。

SAP人员的其他信息:我知道有一个SAP Note 191908表明这是不可能的,但是一位同事已经确认他已经在使用相同功能的HTML页面中成功测试了此类功能我上面复制的代码(请参阅上面的HTML代码和http://jsfiddle.net/1f6npcn2/2/)。所以SAP Note是错误的。我知道如何在HTML中实现此功能,但我不知道如何在JS中实现它。这就是问题所在。

4 个答案:

答案 0 :(得分:1)

我没有与SAP合作的经验,但我认为你在这里缺少一个关键部分。

在您提供的示例中,SAPEVENT:CLICK_ON_ME根本不是http网址,而是会使用参数SAPEVENT在本地计算机上调用处理CLICK_ON_ME - 协议的任何内容。我猜你在你的计算机上安装了某种类型的客户端来为你做这件事(how do I create my own URL protocol? (e.g. so://...)包含更多关于如何实现这一点的信息。)

您的错误消息谈论crossdomain-stuff的原因可能是因为它试图将其解释为host:port

所以换句话说,因为这不是一个http url,所以没有一个Web服务器在另一端工作,因此你不能对它进行ajax请求。

答案 1 :(得分:1)

SAPEVENT:内容不由任何Web服务器处理。 SAP GUI使用嵌入式Internet Explorer并注册自定义协议处理程序。尝试使用ajax技术是没有用的,因为你需要到达客户端的容器,而不是服务器。重申:你不想发送请求&#34;在任何地方,你想说服浏览器发生某个本地导航事件&#34;。 SAP Note 191908包含有关该主题的更多信息。

答案 2 :(得分:0)

不了解SAP视图,但对我而言,这似乎是网络服务器上的常见行为。 我认为SAPEVENT在运行时被服务器解析为更常规的URI。只有视图被解析,而不是像CSS和JS这样的资源,因此JS文件中的SAPEVENT占位符不会被#39 ;解析后,JS解释器不接受它作为有效的URI。解决此问题的常见方法之一是在HTML中创建隐藏表单,或者只创建包含您需要的服务器生成值的隐藏输入。例如

SAP查看:

<input type="hidden" id="my_event_url" value="SAPEVENT:PRESS_ME">

JS:

function sendEvent(id) {
    $.ajax({
        url: $('#my_event_url').val() + '?' + id,
        crossDomain: true
    });
}
sendEvent(2);

答案 3 :(得分:0)

我终于在JavaScript中实现了它。谢谢转到this web page。 我修改了此网页中显示的解决方案,以便在JavaScript中添加链接而不是表单。 这是JS的工作解决方案:

var targetUrl = "SAPEVENT:SOME_TEXT?2";

function sendSapEvent(targetUrl) {
    var link = document.createElement("a");
    link.setAttribute("style", "display:none;");
    link.setAttribute("href", targetUrl);

    // Move the click function to another variable
    // so that it doesn't get overwritten.
    link._click_function_ = link.click;

    document.body.appendChild(link);
    link._click_function_();
}

sendSapEvent(targetUrl);

你也可以在这个JSFiddle中找到它:http://jsfiddle.net/708r95p0/6/

有效!它向URL sapevent:SOME_TEXT?2

发送请求

我决定使用链接而不是表单元素,因为我无法使用表单传递请求参数。