0

我被一个简单的问题困住了,我想让一个 ajax 调用公共 Web 服务,但是得到了“未定义”错误

<script type="text/javascript">
     $(document).ready(function () {
         $('#btn1').click(myFunction);
     });
     function myFunction() {
         var strSearch = $('#txt1').val();
         var parameters = "{'passage':'" + strSearch + "'}";
         $.ajax({
             url: 'http://www.esvapi.org/v2/rest/passageQuery?key=IP&passage=' + strSearch + '&options=include-passage-references=true',
             type: 'GET',
             data: parameters,
             dataType: "json",
             success: function(result) {
                 $('#res1').html(result.data);
             },
             error: function (xhr) {
                 alert(xhr.data);
             }
         });
     }
</script>

公共服务位于http://www.esvapi.org/api。我相信它使用'GET'方法。

调试快照:

图片

4

2 回答 2

0

恐怕由于相同的域策略,您的代码将永远无法工作(可以将信息发送到任何来源,但从违反此策略的来源接收信息是无效的)。

如果 API 未提供jsonp版本,您将需要对站点上的页面执行 ajax 请求,并使用此页面中包含的服务器端逻辑访问 api。

您网站上的此页面将是与此外部服务通信的代理。

这将是您在服务器端需要的示例方法

public string GetPassage(string passage)
{
    using (var c = new System.Net.WebClient())
    {
        string url = "http://www.esvapi.org/v2/rest/passageQuery?key=IP&passage=' + strSearch + '&options=include-passage-references=true";
        return c.DownloadString(Server.UrlDecode(url));               
    }
}

不要直接调用 API,而是在您的页面上调用此操作方法。注意passage是参数

于 2013-06-29T15:16:54.593 回答
0

您一定会遇到跨源资源共享错误。出于安全目的,您不得进行跨域 AJAX。请参阅这篇文章:跨域资源共享 (CORS) - 我在这里遗漏了什么吗?

你有两个选择:

  1. 使用JSONP,但必须得到服务器的支持。
  2. 或者您可以在浏览器中禁用 CORS,然后尝试运行此代码,它会起作用。有关在 chrome 中禁用 cors 的信息,请参阅此帖子:

在 Chrome 中禁用同源策略

于 2013-06-29T15:18:25.333 回答