无法使用$ http从angularjs app调用我的restful服务

时间:2014-02-11 10:49:08

标签: json web-services angularjs rest


我无法使用angularjs $ http从rest webservice读取JSON。我在一个返回JSON的不同项目中有一个简单的rest webservice。当我尝试从角度点击休息服务时,它会转到错误部分。

以下是我的代码: Java中的宁静服务:

package com.demoapp.rest;

import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

/**
 * REST Web Service
 */
@Path("Employee")
public class EmployeeResource {

    @Context
    private UriInfo context;

    /**
     * Creates a new instance of EmployeeResource
     */
    public EmployeeResource() {
    }

    /**
     * Retrieves representation of an instance of com.demoapp.rest.EmployeeResource
     * @return an instance of java.lang.String
     */
    @GET
    @Produces("application/json")
    public String getJson() {
        //TODO return proper representation object
        return "({\"id\":3,\"name\":\"Joe\"})";
    }

    /**
     * PUT method for updating or creating an instance of EmployeeResource
     * @param content representation for the resource
     * @return an HTTP response with content of the updated or created resource.
     */
    @PUT
    @Consumes("application/json")
    public void putJson(String content) {
    }
}

Angularjs代码:

angular.module('myApp.controllers', [])

 .controller('MyCtrl1', ['$scope', '$http', function($scope, $http) {

    $http.jsonp( 
 /*Doesn't work*/ 'http://localhost:8080/mavenproject1/webresources/Employee?callback=JSON_CALLBACK'
 /*Works*/ /*'http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&callback=JSON_CALLBACK'*/
      )

        .success(function(data) {
            console.log('Success '+data);                
        })
        .error(function(data) {
            console.log('Error '+data);
        });

  }])
  .controller('MyCtrl2', [function() {

  }]);

我收到第一个url(localhost ..)的错误,并且相同的angularjs代码适用于另一个公共的restful服务。
任何人都可以告诉为什么angularjs在(http://localhost.。)宁静的服务的控制台中返回错误并成功(http://api.openweathermap.org/...。)?
我到底哪里错了?

1 个答案:

答案 0 :(得分:2)

您正尝试按jsonp访问资源,但您的REST服务返回纯json。你需要使用

$http.get('http://localhost:8080/mavenproject1/webresources/Employee')

网址http://api.openweathermap.org有效,因为它们会返回jsonp格式。如果您向其他域发出请求,则需要此格式。 Jsonp意味着结果包含在函数调用中。函数的名称是动态生成的,由示例中的callback参数指定。

EDIT(上面讨论的结果 - 在生产中,这个应用程序也将运行在两个不同的服务器上,因此有以下选项可以解决问题)

1)您可以在jboss服务器中使用Access-Control-Allow-Origin标头。看看这个答案如何做到这一点:Set response headers not using filter - RESTeasy

2)您可以在tomcat和jboss服务器前使用反向代理。例如,apache webserver可以执行此操作。以下是解决此问题的答案:How to correctly configure a reverse proxy with Apache, to be used for cross-domain AJAX?

3)你可以切换到jsonp - 这有点复杂,因为RESTEasy不直接支持它。看看这篇文章:How enable JSONP in RESTEasy?