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

nic*_*ost 5 post jpa angularjs http-status-code-415

我是REST和AngularJS的新手,但是经过几个小时的搜寻后,我找不到我的问题的任何答案:

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

当我尝试创建json-object并执行POST时,我总是收到415(不支持的媒体类型)错误

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

如何成功格式化“ postData”以便成功发布?

(我也试图写Date属性而不带'“'-没运气...)

谢谢您的帮助!


前端:

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!");
        })
}
Run Code Online (Sandbox Code Playgroud)

});

服务:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ões 5

无需构建和发送已解析的JSON对象,而是创建一个javascript对象并将其发送到您的帖子正文中。您可以重用postData对象,但是请尝试删除周围属性名称的“”。

尝试这个:

    var postData = {
        status : "OPEN",
        startDate: "1338364250000",
        endDate: "1336364253400",
        workText : "Test"
};
Run Code Online (Sandbox Code Playgroud)

更新

看起来上面的方法本身不起作用。我认为可以推断出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.
Run Code Online (Sandbox Code Playgroud)

更新2

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

  • 如果您还没有下载Fiddler2
  • 像下面的屏幕快照一样编写请求

像这样撰写您的POST

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

双击您的要求的行

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

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

如果您可以使用«manufactured»JSON对象成功发布,则问题出在您的Angular代码上。如果不是,那肯定是您的Rest Service配置有问题。

您还可以检查在Fiddler2中使用Angular应用创建的POST的详细信息。这应该使您对正在发生的事情有很好的了解。

如果您有兴趣,可以使用Angular应用程序请求的一些屏幕截图更新问题。那肯定会帮助我们为您提供帮助:)


nic*_*ost 4

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

\n\n

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

\n\n

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

\n\n

-反序列化它(使用GSON)

\n\n

这是(现在正在运行)服务:

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

再次感谢 Ant\xc3\xb3nio 的帮助!

\n