由于CORS,REST无法在bluemix上运行

时间:2016-05-01 15:56:43

标签: json rest post cors ibm-cloud

我是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,但从未成功。

2 个答案:

答案 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 - 带有"。)建立(); }

基本上选项的响应有"允许"服务给出的方法..