我是bluemix的新手,我有简单的Rest服务,功能很少,并且从角度js调用。 以下是休息服务类:
@POST
@Path("getTest")
@Produces("application/json")
public Response getTest(@QueryParam("accountId") String accountId) throws Exception, IOException {
System.out.println("HelloResource.getTest() "+accountId);
...
...
return Response.ok(dbData).header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods","POST, HEAD, GET, DELETE, PUT, OPTIONS")
.build();
}
此外,在客户端角度js在
中调用此休息服务 $scope.searchcall = function(acctid)
{
$http({
method: 'POST',
url: 'http://javarestapi61.mybluemix.net/api/hello/getTest',
headers: {'Content-Type': 'application/json','Access-Control-Allow-Origin': '*'},
data: {"accountId": $scope.accountId}
}).success(function (data)
{
//never been successful onblue mix
}).error(function(data) {
alert("failure1"); //always landing here..
});
};
看起来这是我尝试的最佳解决方案。我不确定,我可以尝试进一步允许对bluemix Rest应用程序进行明确许可。 BTW高于应用程序部署在本地自由时,它运作良好。
我也可以在bluemix上访问相同的Rest服务,如果我将返回类型更改为String并通过浏览器访问..(甚至没有任何其他权限)
此外,我看到Chrome网络详细信息显示,Preflight请求返回并返回200(选项),然后第二个请求是实际POST,但从未成功。
答案 0 :(得分:0)
您可以做的是将方法修改为:
public Response getTest(@QueryParam("accountId") String accountId, HttpServletRequest req) throws Exception, IOException{
//then your code
}
在此之后添加以下内容:
由于浏览器在Allow Origin Header中查找http://127.0.0.1:8080
,您需要确保在以下行中添加此内容:
response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8080");
要获得http://127.0.0.1:8080
,您可以使用:
request.getRemoteAddr() + ":" + request.getRemotePort();
但是如果浏览器寻找localhost,那么请转到:
request.getRemoteHost().
避免添加*
,因为某些浏览器仍然不允许这样做。
希望能解决你的问题。
当然,将其添加到标题中:
response.setHeader("Access-Control-Allow-Methods","POST, HEAD, GET, DELETE, PUT, OPTIONS")
答案 1 :(得分:0)
最后,当我尝试的其他所有内容都无效时,以下解决方案对我有用.. 我刚刚在我的休息服务类中添加了另一个单独的URL ..
@Path(" / getTest&#34)
@OPTIONS
public Response getOptions(){ 返回Response.ok()。header(" Access-Control-Allow-Origin"," *")。header(" Access-Control-Allow-Methods&#34 ;," POST,GET,PUT,UPDATE,OPTIONS")。header(" Access-Control-Allow-Headers"," Content-Type,Accept,X-Requested - 带有"。)建立(); }
基本上选项的响应有"允许"服务给出的方法..