5

我对 REST 和 AngularJS 很陌生,但是经过几个小时的谷歌搜索后,我找不到任何问题的答案:

我正在尝试从我的 angularjs 前端向我在 java 中实现的后端(使用 JPA)发出 POST 请求。

当我尝试创建 json-object 并进行 POST 时,我总是收到415 (Unsupported Media Type) 错误

(实际上我什至没有“进入”服务范围(即“IN SERVICE”不会打印到控制台)。如果我添加 postData.toJSON(),它实际上会“发布”,但是到达空...

我如何格式化我的“postData”才能成功发布?

(我也尝试写没有'“'的日期属性 - 没有运气......)

谢谢您的帮助!


前端:

app.controller('WorkController', function($scope, $http) {

$scope.saveWork = function () {

    var postData = {
    "status" : "OPEN",
    "startDate": "1338364250000",
    "endDate": "1336364253400",
    "WorkText" : "Test"
    };


    $http.post("http://localhost:8080/service/v1/saveWork", postData)
        .success(function(data, status, headers, config){
            console.log("IN SAVE WORK - SUCCESS");
            console.log(status);
        })
        .error(function(){
            console.log("ERROR IN SAVE WORK!");
        })
}

});

服务:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response save(WorkDto wo){
            System.out.println("IN SERVICE");
    if(ass == null){
        System.out.println("Could nor persist work- null");
        return Response.noContent().build();
    } else{
        Work workDao = WorkTransformator.transform(wo);
        workDao.persist();
        return Response.ok().build();
    }
}
4

2 回答 2

5

与其构建和发送解析的 JSON 对象,不如创建一个 javascript 对象并将其发送到您的帖子正文中。您可以重用您的 postData 对象,但尝试删除 "" 周围的属性名称。

尝试这个:

    var postData = {
        status : "OPEN",
        startDate: "1338364250000",
        endDate: "1336364253400",
        workText : "Test"
};

更新

看起来上面的方法本身不起作用。我认为 Content-Type 会被推断出来。

您可以尝试以这种方式进行发布请求吗:

    $http({
       method: 'POST',
       url: 'http://localhost:8080/service/v1/saveWork',
       data: postData,
        headers: {
            'Content-Type': 'application/json'
   }}); // complete with your success and error handlers...
        // the purpose is to try to do the post request explicitly
        // declaring the Content-Type you want to send.

更新 2

如果这不起作用,请使用 Fiddler 编写发布请求,并检查响应是什么。这里有一些提示:

  • 如果您还没有 Fiddler2,请下载它
  • 像下面的屏幕截图一样编写请求

像这样撰写您的帖子

然后,您可以在左侧的窗格中检查服务器响应代码是什么。双击该行(忽略屏幕截图上的错误代码......你应该得到一个 415)

双击您的请求所在的行

双击响应行后,您可以在右侧窗格中查看和浏览更多详细信息:

您可以查看请求和响应的详细信息

如果您可以使用“制造”JSON 对象成功发布,那么问题出在您的 Angular 代码上。如果不是,那肯定是您的 Rest Service 配置有问题。

您还可以检查使用 Fiddler2 中的 Angular 应用程序制作的 POSTS 的详细信息。这应该让您对正在发生的事情有一个很好的了解。

如果您对此感兴趣,则可以使用 Angular 应用请求的一些屏幕截图来更新您的问题。这肯定会帮助我们帮助你:)

于 2014-04-03T17:02:23.293 回答
4

我终于设法找到了我的错误的原因!

在我的 Rest-Service 中,我直接期望我的 java 类作为参数。(我认为这会被自动解析/反序列化)。我认为这很天真...... :) 为了让它工作,我必须:

- 在我的@POST 服务中期望一个字符串作为参数

- 反序列化(使用 GSON)

这是(现在工作的)服务:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response save(String wo){
    if(wo == null){
        System.out.println("Could nor persist work- null");
        return Response.noContent().build();
    } else{
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HHmm:ssZ").create();
        WorkDto dto = gson.fromJson(wo, WorkDto.class);
        Work workDao = WorkTransformator.transform(dto);
        workDao.persist();
        return Response.ok().build();
    }
}

再次感谢安东尼奥的帮助!

于 2014-04-05T10:22:12.767 回答