【问题标题】:POST request doesn't get response from server in chrome but work in postmanPOST 请求在 chrome 中没有得到服务器的响应,但在邮递员中工作
【发布时间】:2019-06-09 12:51:33
【问题描述】:

我正在向 Spring Boot 端点发出 POST 请求,并希望从服务器获取数据返回。通过在 Postman 中测试我的 API,它运行良好。但是在测试时 chrome,它甚至没有得到响应,chrome NETWORK bar 甚至没有记录。 所以代码很简单,找不到问题,RestController

 @PostMapping("/signup")
    public User signup(@RequestBody ModelUser user){
          //fetch data from DTO and craft a user
          User userData=user.adapter();
          //...code here omit for sake of brevity

          return userData;
    }

当我使用 logger(slf4j) 进行调试时,它确实从 ajax 获取数据。 和 ajax:

  $("#sign-up").submit(function () {
           var userInfo={}
           userInfo["phone"]=$("#phone").val()
           userInfo["password"]=$("#password").val()
           $.ajax({
               //ajax successful send to spring boot endpoint
               type:"POST",
               contentType:"application/json",
               url:"http://localhost:8080/signup",
               data:JSON.stringify(userInfo)
           }).then(
               function(){
                  //this doesn't print in console
                  console.log("Hello Callback is executed")
               }
           )
       })

虽然很奇怪,但我在使用 GET 请求时从未遇到过这种情况,因为当我使用 GET 测试 GetMapping 端点时成功调用了 ajax 回调。

哦,有很多类似的问题

我在 chrome 中没有得到任何响应状态代码,并且完全没有涉及有问题的 CORS

【问题讨论】:

  • @user7294900 什么意思?
  • 您在控制器中返回的对象以及 then 回调中的控制台日志的目的是什么?尝试改用@ResponseBody。
  • @ThivankaW 哦,这个端点在一个用RestController注解的类中,我想从服务器获取响应数据并在前端重定向页面
  • 你返回的数据基本上是一个java对象,所以你想在前端页面返回一个java对象?也许你想要这个 json 格式的 java 对象?我在您的 ajax 中没有看到成功回调,您需要先实现它以提取响应
  • @ThivankaW 是的,我想要 JSON 格式。只要后端返回响应,无论失败还是成功,都会调用 then 回调。但关键是我的 ajax 没有得到响应从服务器,更不用说返回的数据了

标签: ajax spring-boot spring-mvc


【解决方案1】:

您是否尝试过在 Java 中添加消费和生产媒体类型的 Json

@PostMapping(path="/signup", consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)

并在 javascript 中明确设置 Accept 标头

   $.ajax({
           //ajax successful send to spring boot endpoint
           type:"POST",
           headers: {Accept : "application/json"},
           contentType:"application/json",
           url:"http://localhost:8080/signup",
           data:JSON.stringify(userInfo)
       })

【讨论】:

  • 不行,我猜是因为spring boot默认消费并产生JSON,而ajax实际上可以智能识别ajax API的内容格式,所以没有任何区别跨度>
【解决方案2】:

对不起,我的前端技术不好,主要原因是我不懂Javascript事件。

$("#sign-up").submit(function (e) {
    //e.preventDefault();
    var user={};
    user["phone"]="187308";
    user["name"]="icywater";
    $.ajax({
        type:'POST',
        contentType:'application/json',
        data:JSON.stringify(user),
        url:"http://localhost:8080/test"

    }).done(function(data){
        console.log("Hello Callback is executed");
        console.log(data)
    });
});

这里当我点击提交时它实际上已经提交了表单并且不等待执行ajax代码,所以我应该使用e.preventDefault()来抑制默认行为。没什么 POST 或者 postman 相关,就是表单提交默认行为,啊,乌龙事件。

我找到this page的时候就知道了

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 2016-12-26
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2013-06-30
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多