我有一个使用SpringBoot开发的弹簧RestController
。
@RestController
@RequestMapping("/myRoot")
public class MyRestController {
@Autowired
private MyService myService;
@RequestMapping(value="/add/{myItem}", method=RequestMethod.POST)
public @ResponseBody void addMyItem(@PathVariable("myItem") String myItem){
myService.addMyItem(myItem);
}
}
包含main
方法的My Spring Boot类是:
@SpringBootApplication(scanBasePackages={"org.mypackage"})
public class MyRestApp {
public static void main(String[] args) {
SpringApplication.run(MyRestApp .class, args);
}
}
当我编译项目时,在Eclipse中运行生成的Jar作为Java Application,控制台显示:
2017-03-17 22:33:14.363 INFO 2292 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-03-17 22:33:14.371 INFO 2292 --- [ main] o.n.todo.springboot.SuperrDuperrRestApp : Started MyRestApp in 7.056 seconds (JVM running for 7.837)
在Chrome上的Postman上发布http://localhost:8080/MyRestApi/myRoot/add/myItem
的电话后,会返回成功(200 OK)。
这意味着我的休息api正确暴露并启动并运行。
我试图从我的AngularJs 1应用程序中调用上面的URI,如下所示:
'use strict';
var myApp = angular.module("MyFirstAngularRestApp",[]);
myApp.controller("myCtrl",myCtrl);
function myCtrl($http){
console.log("myCtrl");
var REST_SERVICE_URI = 'http://localhost:8080/MyRestApi/';
this.AddItem = function(newItem){
console.log("AddItem");
console.log(newItem);
$http.post(this.REST_SERVICE_URI + 'myRoot/add/' + newItem).then(function(response){
console.log("success");
});
}
}
但是,这不起作用。我收到以下错误:
XMLHttpRequest cannot load file:///C:/myDevelopment/Angular/MyAngularApp/undefinedtoDo/add/ReadABook. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
Possibly unhandled rejection: {"data":null,"status":-1,"config":{"method":"POST","transformRequest":[null],"transformResponse":[null],"jsonpCallbackParam":"callback","url":"undefinedtoDo/addItem/Read a Book","headers":{"Accept":"application/json, text/plain, */*"}},"statusText":""}
我是AngularJs 1的新手,所以无法理解为什么我的休息电话不起作用。我错过了什么?
我的AngularJs项目位于笔记本电脑驱动器的不同位置,而我的eclipse工作区是另一个目录。但我相信这不应该是重要的。
我将非常感激,如果有人可以指导我如何解决此错误。请求尽可能详细地回答,因为我是新手。
谢谢!
答案 0 :(得分:1)
这是一个跨源错误,尝试使用 @CrossOrigin 注释您的控制器,它将允许您的应用程序调用API。使用注释,您可以指定域(原点)和方法(PUT,GET,POST等)。查看更多:http://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/javadoc-api/org/springframework/web/bind/annotation/CrossOrigin.html
如果要定义要允许的域,请在配置类中使用以下代码。在这种情况下,您不需要注释所有控制器:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**/*").allowedOrigins("locahost:8080");
}
};
}
答案 1 :(得分:0)
您的角度应用程序和服务器通常在不同的源和浏览器上运行,由于same-origin policy而不支持。
如果您需要 @CrossOrigin 注释,可以通过注释控制器或特定方法轻松解决此问题,如下所示:
@CrossOrigin(origins = "http://localhost:4200", methods = { RequestMethod.POST, RequestMethod.GET, RequestMethod.DELETE,
RequestMethod.PUT })
如您所见,您可以使用主机或支持的http方法等。