Angular $ http.get总是获取ERROR消耗本地Restful Service

时间:2015-06-13 18:22:29

标签: java javascript json angularjs rest

我有一个错误,我感到困惑,我使用Jersey创建了一个简单的Java EE 7项目。

我在Rest Rervice中返回这个课程:

@XmlRootElement
public class LocationDTOx {

    private Long id;        
    private String tittle;    
    private String description;        
    private Long parent;

    //Getter and setters...

在我的服务类中我有:

@Path("/location")
public class LocationService {

    @GET
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/findlocation")
    public LocationDTOx findLocation() {
        System.out.println("findlocation");
        try {
            LocationDTOx x = new LocationDTOx();
            x.setDescription("Description");
            x.setId(0l);
            x.setParent(null);
            x.setTittle("Tittle ...");
            return x;
        } catch (Exception ex) {
            Logger.getLogger(LocationService.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }    

}

如果我把它放在我的浏览器中,我100%确定我的休息是否有效:

http://localhost:8080/BIReportL-war/rest/location/findlocation

我得到了这个Json String:

{" description":" Description"," id":0," tittle":" Tittle ...... "}

这笔交易是在我的角度代码中,我从角度调用其余服务的代码正在执行,但它只是给了我错误部分:

app.controller('questionsController', function ($scope, $http) {
    //var url = "http://localhost:8080/BIReportL-war/rest/location/findlocation";
    //var url = "http://www.w3schools.com/angular/customers.php";
    var url = "http://127.0.0.1:8080/BIReportL-war/json.json";
    $http.get(url)
        .success(
            function (data, status, headers, config) {
                alert("success");   
            })
        .error(function(data, status, headers) {
          alert('Repos status ' + status + ' --- headers : ' + headers);
        })
        .finally(
            function() {
        });
});

我有一个虚拟json文件的另一个本地URL,我可以通过该浏览器访问它,并且我得到相同的结果错误,奇怪的是我尝试使用这个rest public json文件:

http://www.w3schools.com/angular/customers.php

我获得了成功!我不知道为什么,我在做什么或我有什么不对,我的意思是当我尝试使用我的本地休息服务时,我发现它在日志中被调用,这是事实,但是角度客户端正在犯错。

提前感谢您的帮助!

我正在使用: * Glassfish V4 *角

嗯,关于CORS问题我只是把我的休息如下,所以这是解决方案:

@Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/findlocation")
    public Response findLocation() {
        System.out.println("findlocation");
        try {
            LocationDTOx x = new LocationDTOx();
            x.setDescription("Description");
            x.setId(0l);
            x.setParent(null);
            x.setTittle("Tittle ...");

            return Response.ok()
                    .entity(x)
                    .header("Access-Control-Allow-Origin", "*")
                    .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
                    .build();
        } catch (Exception ex) {
            Logger.getLogger(LocationService.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }   

3 个答案:

答案 0 :(得分:2)

如果AngularJS正在访问您的本地REST API,那么您在不同端口上的浏览器中运行它,根据CORS规则(单独端口),它会被视为不同的来源意思是单独的原产地。)

  

如果协议,端口(如果是),则两个页面具有相同的来源   指定的),两个页面的主机相同。

对于Access-Control-Allow-Origin响应标头,可以通过*将其设置为all,或者明确指定备用端口。这与您的浏览器(和AngularJS)正在尝试按照MDN's page on same origin policy上可以找到的规则进行播放这一事实有关。

当您在浏览器中直接加载资源时,这些“规则”不适用,因为源(浏览器加载的页面)是相同的端口,因为您正在加载 资源,在该起源(加上端口)。

[编辑]

CORS标准包括遵守某些响应标头,例如Access-Control-Allow-Origin和Access-Control-Allow-Methods。

参考文献:

[/编辑]

答案 1 :(得分:0)

当您的Angular客户端使用POST($ http.post(url))时,您的Jersey服务正在使用GET(@GET)。

将Angular代码更改为$ http.get,你就可以了。

你的http://www.w3schools.com/angular/customers.php示例正在运行,因为它对POST和GET都有响应,但对于你的场景,GET显然是正确的HTTP动词。

答案 2 :(得分:0)

您是否尝试使用相对网址? var url = "/BIReportL-war/json.json";

你能在这里发布整个错误吗?

我同意@pankajparkar这可能是一个CORS问题。

(很抱歉发布这个'回答',我没有足够的评论积分)