$ http.post方法中的415(不支持的媒体类型)

时间:2014-04-03 15:01:04

标签: angularjs post jpa http-status-code-415

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

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

当我试图创建一个json对象并进行POST时,我总是得到 415(不支持的媒体类型)错误

(实际上,我甚至没有"进入"服务的范围(i.E。" IN SERVICE"没有打印到控制台).. 如果我添加postData.toJSON(),它实际上得到" POSTed",但是到达null ...

如何格式化我的' postData'为了成功获得发布?

(我也尝试在没有''' - 没有运气的情况下写日期属性...)

感谢您的帮助!


前端

app.controller(' WorkController',功能($ 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();
    }
}

2 个答案:

答案 0 :(得分:5)

创建一个javascript对象并将其发送到您的帖子正文中,而不是构建和发送已解析的JSON对象。您可以重用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,请下载
  • 撰写如下截图中的请求

Compose your POST like this

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

Double click the line with your request

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

You can check the request and response details

如果你能成功发布一个«制造»JSON对象,那么问题就出在你的Angular代码上了。如果没有,那么您的Rest Service配置肯定有问题。

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

如果您正在使用它,则可以使用Angular应用程序请求的一些屏幕截图更新您的问题。这肯定会帮助我们帮助你:)。

答案 1 :(得分:3)

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

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

- 在@POST服务中将String视为参数

- 反序列化(使用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();
    }
}

再次感谢António的帮助!