【问题标题】:Spring @RequestBody working with Postman, but a 415 with javascript from browser [duplicate]Spring @RequestBody 与 Postman 一起使用,但 415 与浏览器中的 javascript [重复]
【发布时间】:2021-09-04 22:44:09
【问题描述】:

我是一名初级 Web 开发人员,主要在 Spring Boot 上使用 java 完成工作。刚刚开始熟悉 javascript,现在遇到了一个与 stackoverflow 上的许多其他问题相似的问题,但不同之处似乎在于,使用 Postman 发布时一切正常,但是当通过 javascript 尝试使用浏览器时,我会得到一个415.

alert(JSON.stringify(task)) 给出(当“taskName”=“walk”时):{"name":"walk"}

当用 Postman POST 同一个 body 时,响应是:

{
    "id": 65,
    "name": "walk",
    "new": false
} 

jackson-databind、-core 和 -annotations 版本 2.10.1 的依赖项正在使用中。

java代码:

var url = contextRoot + "tasks"
var http = new XMLHttpRequest()

http.onreadystatechange = function() {

    alert("readystatechange")

    //if (this.readyState != 4) {
    //    return
    //}
       
    document.getElementById("received").innerHTML = this.responseText
    
}

function addTask() {
   
    var task = {
    name: document.getElementById("taskName").value
    }

    alert(JSON.stringify(task))

    http.open("POST", url)
    http.send(JSON.stringify(task))
}

我的@RestController

@RestController
public class TaskController {

    @Autowired
    private TaskRepository taskRepository;

    @GetMapping("/tasks")
    public List<Task> list() {
        return taskRepository.findAll();
    }

    @PostMapping(path = "/tasks", consumes = "application/json", produces = "application/json")
    public Task create(@RequestBody Task task) {
        System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!");
        System.out.println(task);
        return taskRepository.save(task);
    }
    
    /*@PostMapping("/tasks")
    public String create(@RequestBody String task) {
        System.out.println("!!!!!!!!!!!!!!!!!!!!");
        System.out.println(task);
        return "hilipataheijjaa";
    }*/
    
}

HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head lang="en">
        <meta charset="UTF-8" />
        <title>Tasks</title>
    </head>
    <body>

        <h2>Tasks</h2>
                
        <input type="text" id="taskName"/>
        <button onclick="addTask()">Add Task</button>

        
        <p id="received">
        </p>

        <script th:inline="javascript"> var contextRoot = /*[[@{/}]]*/ '';</script>
        <script th:src="@{/javascript/tasks.js}" defer></script>
        </body>
</html>

Task.java

import javax.persistence.Entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.jpa.domain.AbstractPersistable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Task extends AbstractPersistable<Long> {

    private String name;

}

XMLHttpRequest.responseText:

{"timestamp":"2021-06-21T08:27:33.989+00:00","status":415,"error":"不支持 媒体 类型","trace":"org.springframework.web.HttpMediaTypeNotSupportedException: 不支持内容类型 'text/plain;charset=UTF-8'\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:227)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:422)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:110)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:59)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:395)\r\n\tat org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1234)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1016)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:652)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:834)\r\n","message":"内容 type 'text/plain;charset=UTF-8' not supported","path":"/tasks"}

弹簧控制台: 2021-06-21 11:27:02.189 WARN 5152 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [org.springframework.web.HttpMediaTypeNotSupportedException:内容 类型 'text/plain;charset=UTF-8' not supported] 2021-06-21 11:27:33.988 警告 5152 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver :已解决 [org.springframework.web.HttpMediaTypeNotSupportedException:内容 type 'text/plain;charset=UTF-8' not supported]

提前致谢!

【问题讨论】:

  • javascript 应用程序是否与 web-apis 应用程序一起部署?

标签: javascript java spring-boot


【解决方案1】:

错误很明显。 => HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported

//Send the proper header information along with the request
http.setRequestHeader('Content-type', 'application/json');

你可以添加这个试试看。

【讨论】:

  • 谢谢!!如此简单……这么多小时。只需要把它放在http.open("POST", url) 行之后。在它之前先尝试过,代码没有比这个新行更进一步。
  • 如果这个答案对你有用,你可以批准这个答案。
  • 我尝试“投票”,但是:“感谢您的反馈!您需要至少 15 个声望才能投票,但您的反馈已被记录。”。有没有其他审批方式?
  • 我不知道:D
  • 抱歉,我花了一段时间才意识到接受答案与投票不同。 .现在完成了。
【解决方案2】:

Spring boot Application 将返回 JSON 格式。

http.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
    var myArr = JSON.parse(this.responseText);
    console.log(myArr);
}
};

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2020-11-20
    • 2019-06-28
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多