【问题标题】:Unable to POST data from Angular application to Play! Framework无法将数据从 Angular 应用程序发布到 Play!框架
【发布时间】:2015-10-28 22:01:56
【问题描述】:

我从浏览器调试器中收到以下错误:

在 Access-Control-Allow-Origin 标头中找不到来源 http://localhost:8000

但是我已经在我的 API 的 Global.java 文件中设置了标题:

Global.java

@Override
public Promise<SimpleResult> call(Http.Context ctx) throws java.lang.Throwable {
    Promise<SimpleResult> result = this.delegate.call(ctx);
    Http.Response response = ctx.response();
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setContentType("application/json");
    return result;
}

这是我正在使用的 API 路线。

路线

POST        /api/users/insertuser                      @controllers.UserController.insertUser

这里是控制器方法:

UserController.java

@BodyParser.Of(BodyParser.Json.class)
public Result insertUser() {
    JsonNode json = request().body().asJson();
    String email = json.findPath("email").asText();
    String username = json.findPath("username").asText();
    String password = json.findPath("password").asText();
    if(email == null || username == null || password == null) {
      return badRequest("Missing parameter[s]");
    } else {
        User user = new User(username, email, false, password, getDate(), getDate());
        repo.insertUser(user);
        return getUserByEmail(email);
    }
}

这是来自 Angular 应用程序的 API 调用:

userapiservice.js

var factory = {};
var baseUrl = 'http://127.0.0.1:9000/api/users/';

factory.insertUser = function (user) {
  return $http({
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    url: baseUrl + 'insertuser/',
    params: { username: user.username, email: user.email, password: user.password }
  });
};

我有什么遗漏/做错了吗?尝试了几个浏览器,现在已经坚持了大约一个星期,我一直在自学,我已经找到了 Play!文档是...好的。

【问题讨论】:

  • 您是否尝试过 goggle 并出现该错误? api上的CORS设置错误
  • 是的,我确实这样做了,实际上我从 Google 获得了这些 CORS 设置,我设置错了什么?
  • 确保允许 OPTIONS 请求。我对play一无所知,但问题肯定是CORS developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

标签: javascript java json angularjs playframework


【解决方案1】:

首先添加预检请求

OPTIONS   /*all                                     controllers.Application.preflight(all)

public static Result preflight(String all) {
    response().setHeader("Access-Control-Allow-Origin", "*");
    response().setHeader("Allow", "*");
    response().setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS, PATCH");
    response().setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Referer, User-Agent, access_token, mode");
    return ok();
}

但要记住

@Override
    public Promise<SimpleResult> call(Http.Context ctx) throws java.lang.Throwable {
        Promise<SimpleResult> result = this.delegate.call(ctx);
        Http.Response response = ctx.response();
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setContentType("application/json");
        return result;
    }

调用在内部服务器错误时不起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多