2017-03-17 62 views
1

我有一个弹簧RestController,这是我使用SpringBoot开发的。

@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方法我的春天引导类是:

@SpringBootApplication(scanBasePackages={"org.mypackage"}) 
public class MyRestApp { 
public static void main(String[] args) { 
    SpringApplication.run(MyRestApp .class, args); 
} 
} 

当我编译该项目运行生成的JAR在Eclipse的Java应用程序,控制台显示:

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上的http://localhost:8080/MyRestApi/myRoot/add/myItem邮寄回电成功(200 OK)。

这意味着我的其余api已正确显示并正常运行。

我想上面休息URI调用从我AngularJs如下1个应用:

'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,所以无法理解为什么我的REST调用是行不通的。我错过了什么?

我的AngularJs项目位于笔记本电脑驱动器的不同位置,而我的eclipse工作区是不同的目录。但我相信这不应该是重要的。

我会很感激,如果有人能指导我如何解决这个错误。请尽可能详细地回答,因为我是新手。

谢谢!

回答

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"); 
     } 
    }; 
} 
0

你的角度应用程序和服务器在不同的起源和浏览器中运行一般,不支持,由于same-origin policy

您可以轻松地通过注解你的控制器或特定的方法解决这个问题,如果你想与@CrossOrigin注解如下:

@CrossOrigin(origins = "http://localhost:4200", methods = { RequestMethod.POST, RequestMethod.GET, RequestMethod.DELETE, 
    RequestMethod.PUT }) 

正如你所看到的,你可以用特定的主机或支持的http方法等。