AngularJS没有获得API响应

时间:2017-01-10 17:02:29

标签: javascript angularjs web-services jax-rs osgi

使用AngularJS和在OSGi环境(KARAF)中运行的CXF-JAXRS库,我试图让简单的API响应正常工作。

日志显示AngularJS正确连接到REST服务,并且正在使用200状态代码正确响应。但是,在AngularJS中,发回的信息无法被检索。

仅供参考:我不得不接受" http://"因为StackExchange告诉我,我没有足够的声誉来包含它们。但他们会在实际的代码/日志中出现。

REST方法I连接到

@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public Response test(){
    String testResponse = "Success.";
    Response responseString = Response
            .status(200)
            .entity(testResponse)
            .build();
    return responseString;
}

AngularJS控制器

        app.controller('HttpController', function($scope, $http){
        $http({
            method: 'GET',
            url: 'localhost:8181/cxf/strsoftware/test'
        }).then(function successCallback(response){
                $scope.testString = response.data;
        }, function errorCallback(response){
                $scope.testString = response;
        });
        $scope.validationString = "Controller is functional.";
    });

AngularJS Display Code

<div ng-controller="HttpController">
The response is {{ testString }}<br>
{{validationString}}

在AngularJS HTML页面上显示

连接时显示KARAF日志

2017-01-10 11:42:30,133 |信息| qtp84694963-897 | LoggingInInterceptor | 107 - org.apache.cxf.cxf-core - 3.2.0.SNAPSHOT |入站消息

ID:20 地址:localhost:8181 / cxf / strsoftware / test Http-Method:GET 内容类型:

标题:{Accept = [application / json,text / plain, / ],accept-encoding = [gzip,deflate,sdch,br],Accept-Language = [en-US, en; q = 0.8],connection = [keep-alive],Content-Type = [null],Host = [localhost:8181],Origin = [localhost:63343],Referer = [localhost:63343 / STRFrontEnd / StartScreen。 html?_ijt = qsu1c8a1qskj0def9ho1rml4hv],User-Agent = [Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 55.0.2883.87 Safari / 537.36]}

2017-01-10 11:42:30,135 |信息| qtp84694963-897 | LoggingOutInterceptor | 107 - org.apache.cxf.cxf-core - 3.2.0.SNAPSHOT |出站消息

ID:20 响应代码:200 Content-Type:application / json 标题:{Content-Type = [application / json],Date = [Tue,2017年1月10日16:42:30 GMT]}

有效负载:成功。

更新

通过在Chrome上打开Inspect页面(Ctrl + Shift + I)并点击&#39; Console&#39;,我们发现了以下错误:

angular.js:11756XMLHttpRequest无法加载localhost:8181 / cxf / strsoftware / test。交叉源请求仅支持协议方案:http,数据,chrome,chrome-extension,https,chrome-extension-resource。

这是服务器端错误,因此我们当前正在将CORS实施到服务器端以查看是否可以解决问题。发现解决方案后会发布。

3 个答案:

答案 0 :(得分:1)

您正在.then()中调用匿名函数。 所以它应该是这样的:

$http({
        method: 'GET',
        url: 'localhost:8181/cxf/strsoftware/test'
    }).then(function(response){
            $scope.testString = response.data;
    }, function(response){
            $scope.testString = response;
    });

答案 1 :(得分:1)

试试这个,如果没有工作替换数据:''参数:{}

        $http({
            method: 'GET',
            url: 'localhost:8181/cxf/strsoftware/test',

            // Just to be sure! maybe you don't need it
            dataType: 'json',
            headers: {
                "Content-Type": "application/json"
            },

            //To be sure Angular does NOT remove the content-type header.
            data: '',
        }).then(function successCallback(response) {
            $scope.testString = response.data;
        }, function errorCallback(response) {
            $scope.testString = response;
        });

修改

查看此答案下方的评论,了解Shadmehr解决问题的位置。解决方案是将CORS过滤器实现到应用程序的服务器端部分。尝试访问API时,我们在浏览器中收到了Cross Region错误。

答案 2 :(得分:0)

不确定您的js代码是否正确。我还尝试了角度js,我的代码看起来像这样:

$http.get("/cxf/strsoftware/test")
  .success(function (response) {$scope.testString = response.data;});

有关我的完整代码,请参阅blueprint-cdi-example