簡體   English   中英

春季休息服務|請求方法'GET'不受支持

[英]Spring Boot Rest Service | Request method 'GET' not supported

我使用彈簧靴做了一個hello world rest服務。 我可以通過獨立的java程序調用該服務。 我也可以通過Chrome的Advanced Rest Client插件來調用它。

但是,當我嘗試使用jQuery AJAX通過獨立的HTML頁面訪問它時,我收到錯誤

WARN 3748 --- [nio-9000-exec-2] osweb.servlet.PageNotFound:不支持請求方法'GET'

任何幫助表示贊賞。

PS:我假設因為我可以使用其他模式調用WebService,所以控制器很好。 但是我從HTML中調用它的方式出了問題。

HTML頁面如下:

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Client</title> <script type="text/javascript" src="jquery-2.2.3.js"> </script> <script type="text/javascript"> $(document).ready(function() { $("#Submit").click(function() { var input = { "name": $("#name").val(), "language": $("#language").val() }; var inputStr = JSON.stringify(input); alert(inputStr); $.ajax({ url: "http://localhost:9000/rest/greetMeObj/", method: "POST", data: inputStr, dataType: "jsonp", success: function(output) { // callback method for further manipulations var str = JSON.stringify(output); $("#output").text(data); }, error: function(data) { // if error occured $("#error").text(data); } }); }); }); </script> </head> <body> <div id="input"> <label><b>Name:</b> </label> <input type="text" name="name" id="name" alt="Enter you name" title="Enter your name" /> <br /> <br /> <label><b>Language:</b> </label> <select name="language" id="language" title="Select your language"> <option value="en" label="English" selected="selected">English</option> <option value="fr" label="French">French</option> <option value="nl" label="Dutch">Dutch</option> </select> <br /> <br /> <button title="Submit" type="button" name="Submit" id="Submit" value="Submit" formaction="POST">Submit</button> </div> <div id="output"></div> <div id="error" style="color: red;"></div> </body> </html> 

彈簧控制器如下

@Controller
@RequestMapping("/rest/*")
public class GreetingController {

    private static final String TEMPLATE_EN = "Hello, %s!";
    private static final String TEMPLATE_FR = "Bonjour, %s!";
    private static final String TEMPLATE_NL = "Hallo, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping(value="/rest/greetMe", method= RequestMethod.GET)
    public @ResponseBody Greeting sayHello(
            @RequestParam(value = "name", required = false, defaultValue = "Stranger") String name,
            @RequestParam(value = "language", required = false, defaultValue = "en") String language) {
        return new Greeting(counter.incrementAndGet(), String.format(getTemplate(language), name));
    }

    @RequestMapping(value="/rest/greetMeObj", method= RequestMethod.POST)
    public @ResponseBody Greeting sayHello(
            @RequestBody(required = true) Input input) {
        return new Greeting(counter.incrementAndGet(),
                String.format(getTemplate(input.getLanguage()), input.getName()));
    }

    private String getTemplate(String language) {
        String template;
        switch (language) {
        case "nl":
        case "NL":
            template = TEMPLATE_NL;
            break;
        case "fr":
        case "FR":
            template = TEMPLATE_FR;
            break;
        case "en":
        case "EN":
        default:
            template = TEMPLATE_EN;
            break;
        }
        return template;
    }
}

我想解決方案在這里描述: 為什么不支持SpringMVC Request方法'GET'?

RequestMapping中的兩個值必須相同。 因此,對於每個值,您必須為GET定義一個值,為POST定義一個值。

@RequestMapping(value="/rest/greetMe", method= RequestMethod.GET)
public @ResponseBody Greeting sayHello(
        @RequestParam(value = "name", required = false, defaultValue = "Stranger") String name,
        @RequestParam(value = "language", required = false, defaultValue = "en") String language) {
    return new Greeting(counter.incrementAndGet(), String.format(getTemplate(language), name));
}

@RequestMapping(value="/rest/greetMe", method= RequestMethod.POST)
public @ResponseBody Greeting sayHello(
        @RequestBody(required = true) Input input) {
    return new Greeting(counter.incrementAndGet(),
            String.format(getTemplate(input.getLanguage()), input.getName()));
}

檢查控制器,如果已將任何這些調用映射到默認映射:

    @DeleteMapping()
    @PostMapping()
    @GetMapping()

它映射到path="/" 請改成它

    @DeleteMapping(path="/something")
    @PostMapping(path="/something")
    @GetMapping(path="/something")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM