我无法使用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/...。)?
我到底哪里错了?
答案 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?