我正在使用一个简单的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()
答案 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();
}
就是这样