【问题标题】:Curl command not working (Spring Boot project)卷曲命令不起作用(Spring Boot 项目)
【发布时间】:2020-01-06 03:22:18
【问题描述】:

我想显示 MySQL 数据库中所有以 id = 275 开头的消息。我写了一个我不知道的 curl 请求。可能请求写错了。可能是查询语法出错了——

curl -H "Content-Type: application/json" -d "{ \"messageId\": \"275\" }" localhost:8080/api/unread

但是当我通过命令行运行这个 curl 请求时,它显示了一个错误。

{"timestamp":"2020-01-06T03:13:07.899+0000","status":405,"error":"Method Not Allowed","message":"Request method 'POST' not supported","trace":"org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(

我的代码 输入消息类

public class InputMessage {

    private long messageId;

    public InputMessage(long messageId) {
        this.messageId = messageId;
    }

    public InputMessage() {
    }

    public long getMessageId() {
        return messageId;
    }

    public void setMessageId(long messageId) {
        this.messageId = messageId;
    }
}

休息控制器

public class RestController {

    @Autowired
    TimerTask timerTask;

    @Resource
    private final MessageService messageService;

    public RestController(MessageService messageService) {
        this.messageService = messageService;
    }

    @PostMapping("/api/save")
    public MessageStatus saveMessage(@RequestBody Message chatMessage) {
        return messageService.add(chatMessage);
    }

    @GetMapping("/api/last")
    public String getLasts() {
        return new Gson().toJson(messageService.getLast());
    }

    @GetMapping("/api/unread")
    public void getUnreadMessages() {

        timerTask.run();
    }

    @GetMapping("/api/unread/byid")
    public List<Message> getUnreadById(@RequestBody InputMessage message) {
        return messageService.getUnreadById(message);
    }

消息服务实现

public class MessageServiceImpl implements MessageService {
    private final MessageRepository repository;
    private final PageRequest lastRequest;

    private List<Long> chekedMessages = new ArrayList<>();


    @Autowired
    public MessageServiceImpl(MessageRepository repository) {
        this.repository = repository;
        lastRequest = new PageRequest(0, 10, Sort.Direction.DESC, "id");
    }

    @Override
    public MessageStatus add(@RequestBody  Message message) {
        if(message == null) {
            System.out.println("Пришел пустой запрос на сохранение данных");

        }
        MessageStatus status = new MessageStatus();
        try {
            repository.save(message);
            status.setMessage("Сообщение успешно сохранено");
        }
        catch (Exception e) {
            status.setMessage("Во время сохранения сообщения произошла ошибка");
        }
        return status;
    }

    @Override
    public List<Message> getAllMessages() {
        return repository.findAll();
    }

    @Override
    public List<Message> getLast() {
        List<Message> result = repository.findAll(lastRequest).getContent();

        return result.stream()
                .sorted(Comparator.comparingLong(Message::getId))
                .collect(Collectors.toList());
    }

    @Override
    public List<Message> getUnreadById(InputMessage message) {
         return repository.getUnreadById(message.getMessageId());
    }



    @Override
    public String getUnreadMessages() {
        List<Message> out = new ArrayList<>();
        List<Message> unchekedMessages = repository.findAll();
        for (Message message: unchekedMessages) {
            if (!chekedMessages.contains(message.getId())) {
                chekedMessages.add(message.getId());
                out.add(message);
            }
        }
        return new Gson().toJson(out);
    }

    @Override
    public void updateMessage(long id, Message message) {
        if (repository.findById(id).isPresent()) {
            message.setId(id);
            repository.save(message);
        }
    }

github https://github.com/fallen3019/vaadin-chat

【问题讨论】:

  • 注意HTTP动词already包含“save”等信息;创建对象的常用 REST 路径就是 POST /objects

标签: java spring spring-boot curl


【解决方案1】:

查看您的控制器和 curl 请求,您正在调用 /api/unread,它在您的 RestController#getUnreadMessages() 中声明为 GET 请求。

猜你的意思是点击 POST /api/save,在这种情况下,只需将 curl 请求更改为以下 curl -H "Content-Type: application/json" -d "{ \"messageId\": \"275\" }" localhost:8080/api/save

如果您打算调用/api/unread,因为这是不需要任何参数的 GET 请求,您可以简单地调用它 curl -X GET "localhost:8080/api/unread" -H "Content-Type: application/json"

【讨论】:

  • curl -X GET -H "Content-Type: application/json" -d "{ \"messageId\": \"275\" }" localhost:8080/api/unread rigth?
  • curl -X GET "localhost:8080/api/unread" -H "Content-Type: application/json" 就是这样!
  • 你误会了,我需要显示所有以 id = 275 开头的消息
  • @bella0304 这不是你的问题。您的问题是为什么您提供的代码返回 405 错误消息。 Please ask only one question per post
  • @bella0304 好吧,在这种情况下,您需要修改自己的 API。按照最佳 REST API 设计实践,您可以将 messageId 作为 API URL 本身的路径参数。如api/unread/{messageId}。然后在您的控制器中,您将messageId 读作@PathVariable Long messageId。根据这个messageId,进行服务调用并返回结果
【解决方案2】:

很明显,它认为您执行的是 post 调用而不是 get 调用。请指定 -X GET 并将数据保存在 -d 中,就像您已经做的那样。 我很确定 curl 假设 -X 和 -d 默认情况下是 POST,如果没有另外指定。

【讨论】:

    【解决方案3】:

    根据给出的程序代码,端点/api/unread 只支持GET,不支持POST。要通过 curl 触发 GET,请添加 -X GET

    curl -H "Content-Type: application/json" \
        # -d "{ \"messageId\": \"275\" }" \ # as of now, the body is not used and can be commented-out
        -X GET \ 
        -v \ # enable debug output to see response headers
        localhost:8080/api/unread
    

    或者,或者,将端点更改为/api/save

    curl -H "Content-Type: application/json" \
        -d "{ \"messageId\": \"275\" }" \
        localhost:8080/api/save
    

    【讨论】:

    • Api 保存,对他来说我还有一个 curl 请求
    • 我先写了GET-example,因为这个例子引入了一些“新”(-X GET) =)
    • curl -H "Content-Type: application/json" -d "{ \"messageId\": \"275\" }" -X GET localhost:8080/api/unread rigth?
    • 对应的端点是void方法(public void getUnreadMessages())。如果timerTask.run() 启动异步任务或返回(及时),您应该看到200 OK 响应标头和空正文。确保将-v 添加到curl 命令以查看响应标头。此外,您不能从 curl 命令中删除正文 (-d { ... }),因为它不是由端点评估的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-02-24
    • 2019-11-27
    • 2021-12-02
    • 2012-04-08
    • 2018-06-05
    相关资源
    最近更新 更多