问题是在POST请求中向Play App发送JSON

时间:2015-08-25 21:10:58

标签: angularjs post playframework request http-status-code-404

我正在使用一个简单的Java模板使用Play Framework 2.4开发一个项目,正如我在许多文档中看到的那样,我只是用我的业务方法编写了一个简单的控制器,并在路径文件中放置了必要的路径。

现在我在Angular.js中编写一个客户端来调用play app中编写的逻辑。它与GET方法完美配合,但是当我尝试使用下一行从角度进行POST时:

$http({
        method: 'POST',
        url : rootURL + '/user/company',
        data : {id : '123456' , name: 'xxxxxx'}
});

我收到404错误。经过几个小时的论坛搜索后,我发现Play App在请求内容类型标题中需要 application / x-www-form-urlencoded

所以我将Angular调用修改为以下内容:

$http({
        method: 'POST',
        url : rootURL + '/user/company',
        data : {id : '123456' , name: 'xxxxx'},
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        transformRequest: function(obj){
            var str = [];
            for(var p in obj)
                str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                return str.join("&");
        }

    })
};  

POST在这种方式下工作得很好,但是我想知道,有什么方法可以向我的播放应用程序发出POST请求,其中content-type设置为application / json?怎么能实现这个目标?

更新

这是我的控制器代码:

public class MyController extends Controller {

     public Result myAction(){
         //do funny stuffs              
     }
}

我的路线文件有以下

POST    /path/action               controllers.MyController.myAction()

1 个答案:

答案 0 :(得分:1)

您是否在动作方法中添加了@ BodyParser.Of(BodyParser.Json.class)?

此外,当您对其他域进行POST时,首先检查您是否请求查看它是否为POST,我不知道AngularJS,但是对于Polymer,它在ajax POST期间首先向不同的域发送了一个OPTION,并且我遇到了非常类似的问题(错误的内容类型和404),通过在接受POST的服务器上实现OPTION来解决。

要解决此问题,您需要手动实现OPTION,这是做什么:

首先,在您的路线文件中,添加一个条目以接受OPTION

OPTIONS    /*url                controllers.Application.optionCheck(url)

然后实现接受所有内容的optionCheck方法

    public Result optionCheck(String url){
    response().setHeader("Access-Control-Allow-Origin", "*");
    response().setHeader("Access-Control-Allow-Methods", "POST");
    response().setHeader("Access-Control-Allow-Headers", "accept, origin, Content-type, x-json, x-prototype-version, x-requested-with");
    return ok();
}

就是这样