如何从 Java Rest Web 服务返回 ajax 值?

Posted

技术标签:

【中文标题】如何从 Java Rest Web 服务返回 ajax 值?【英文标题】:How to return a value in ajax from a Java Rest Web service? 【发布时间】:2014-04-21 13:48:20 【问题描述】:

我有一个带有 html 和 JQuery 的 Web 应用程序,其中有一个登录表单。当我单击提交按钮时,我正在使用 ajax 使用 Post 请求将数据发送到 Web 服务。 Web 服务是用 Java 构建的。

这是我的 html 表单:

<form id="mdxLogin" action="" method="post">
    <div class="ui-content">
            <p><input type="email" id="mdxEmail" name="mdxEmail" class="ui-field-contain" value="" placeholder="MDX Email" /> </p>
            <p><input type="password" id="mdxPassword" name="mdxPassword" class="ui-field-contain" value="" placeholder="MDX Password" /></p>
    </div>
    <div class="ui-content">
            <input type="submit" class="ui-field-contain" value="Login" id="sub"/>
    </div>
</form>

下面是我发布到我的网络服务的 Ajax 代码

$("#mdxLogin").submit(function(e) 
    e.preventDefault();
    var mdxEmail = $("input[name=\"mdxEmail\"]").val();
    var mdxPassword = $("input[name=\"mdxPassword\"]").val();

    $.ajax(
        type: "POST",
        url:"http://localhost:8080/RestService/rest/loginService/login",
        dataType:"json",
        data: $("#mdxLogin").serialize(),
        success: function(data, textStatus, jqXHR) 
            // handle your successful response here
            alert(data);
        ,
        error: function(xhr, ajaxOptions, thrownError) 
            // handle your fail response here
            alert("Error");
        
    ); 

)

以下是我的网络服务中的方法

@POST
@Path("/login")
@Produces(MediaType.TEXT_PLAIN)
public String login(@FormParam("mdxEmail") String mdxEmail, @FormParam("mdxPassword") String mdxPassword) 
  System.out.println(mdxEmail);
  DBStudent s = new DBStudent();
  String url = null;

  if (s.checkLogin(mdxEmail, mdxPassword)) 
      url = s.getCalendar(mdxEmail, mdxPassword);
  

  return url;
 

到目前为止,我设法将数据发布到我的网络服务,但没有得到任何响应。我的问题是如何使用 Ajax 从我的 Web 服务访问返回的 url?

【问题讨论】:

首先,在 Firebug(或等效)打开的情况下运行 JS 代码。它发送什么? (您可以在此处发布数据 - 发送的数据、响应 HTTP 代码、响应正文、请求和响应标头,尤其是 Accepts:。) 基本上这会将登录详细信息发送到 Web 服务。然后web服务验证登录,根据登录web服务应该返回一个url字符串(我不知道怎么做最后一部分) 在进行此调用时,您在 Firebug 中看到的响应正文是什么? (通常您的代码看起来不错,可能缺少一些细节。)另外 - 您是否尝试生成另一种媒体类型? 到目前为止我还没有使用过 Firebug,也许我应该尝试一下。但我注意到的是,当我提交表单时,我的 ajax 中的错误块被执行。我还注意到,在我提交表单后,chrome 中的控制台给了我这个错误XMLHttpRequest cannot load http://localhost:8080/RestService/rest/loginService/login. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. 我刚刚尝试使用 Firebug,作为响应,我得到了整个 HTML 文档 【参考方案1】:

在您的代码中,我发现了一个错误,它应该会阻止它正常工作。 在客户端,您对 jQuery 说预期的类型是 JSON,但服务器会生成一个字符串,在您的情况下是一个 URL,它不是 JSON。 因此,jQuery 在尝试解析接收到的数据时会失败,因为它不是 JSON 数据。这个错误应该会触发 jQuery 错误块。

仅在客户端中应用此更改:

dataType:"text"

如果你想测试你的代码而不用担心同源策略,你可以禁用它,看看这些线程

Disable firefox same origin policy

Disable same origin policy in Chrome

【讨论】:

以上是关于如何从 Java Rest Web 服务返回 ajax 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将PNG图像从Jersey REST服务方法返回到浏览器

从 ReactJS 调用 REST Web 服务

如何从 JavaScript 调用 REST Web 服务 API?

Flutter DropdownButton - 从 REST Web 服务填充项目

我如何将在本地工作的 Web 服务(REST api,在 java 中)上传到主机服务器

如何在c#中使用Rest Web服务