2

我正在使用我非常缺乏经验的 AngularJS 开发一个网络应用程序。

我的目标是让用户在文本字段中键入一些参数,然后使用该参数作为 GET 请求中的参数之一发送 GET 请求(使用 Angular 中的 $http 服务)。

请求的目标是 KDB+ 进程(来自 KX Systems 的专有的面向列的数据库/语言)。这个过程可以接受以下形式的请求:

http://servername:1234/?queryToRunHere[paramFromApp]

此调用应返回 JSON 字符串。由于网络服务器和此进程在不同的端口上运行,我收到“Access-Control-Allow-Origin”错误,阻止我将此查询运行到不同的端口。我试图使用 $http.jsonp 命令(因为我读到这允许远程获取)但是这要求我提供一个“&callback”参数。这是不可能的,因为 KDB+ 会解释“?”右侧的所有内容。作为内部查询。

我不确定如何进行,但到目前为止,这些是我的想法:

  1. KDB+ 为 Java 提供了一个 API(但据我所知 JavaScript 没有)。也许我可以用 Java 编写某种 Web 服务,然后可以通过 Angular 调用它,然后再使用其原生 API 调用 KDB+。这样做的问题是它创建了另一个要维护的程序,而且我不确定如何编写这样的服务(什么技术、框架等)。

  2. Angular 内部还有另一种我不知道的方法,或者有一种方法不必在 $http.jsonp 中指定回调参数。

我将不胜感激任何帮助。

4

2 回答 2

5

Access-Control-Allow-Origin由于浏览器内置相同的来源策略,您会收到错误消息。默认情况下,当您的 JavaScript 和服务器 API 不是来自同一个server:port. 为了解决这个问题,您需要Access-Control-Allow-Origin在来自服务器的 HTTP 响应的标头中指定。

要在 KDB/Q 中完成此操作,请执行以下操作:

.z.ph:{ "\r\n" sv ("HTTP/1.1 200 OK"; "Access-Control-Allow-Origin: *"; 
"Content-Type: application/json"; ""; (.j.j select from aTable)) }
于 2014-04-21T14:43:18.497 回答
2

该错误通常仅由不同的服务器引起,为了防止跨站点脚本,通常的解决方法是在您的 apache 配置中添加标头。确保使用相同的主机名引用这两个服务。

或者,如果您愿意,可以自定义 KDB+ 响应,但如果您是 q 的新手,这可能会很棘手。

  1. .z.ph控制 KDB 对 HTTP 请求的处理,您可以覆盖它以处理任何参数并返回您想要的任何内容。可以在KX wiki上看到一个示例。

  2. KDB+ 3.0 和更新版本还提供了您可能会发现更有用的 Web 套接字。它们由.z.ws处理。

可以在 Carlos Butlers 的WebStudio中看到它在 javascript 中的使用示例。

希望这些为您提供了解决问题的方法。

于 2013-01-19T12:28:30.033 回答