Java Curl命令不工作(Spring启动项目)

Java Curl命令不工作(Spring启动项目),java,spring,spring-boot,curl,Java,Spring,Spring Boot,Curl,我想显示MySQL数据库中以id=275开头的所有消息。我写了一个卷发请求,我不知道。也许请求写得不对。可能是查询语法出错了- curl -H "Content-Type: application/json" -d "{ \"messageId\": \"275\" }" localhost:8080/api/unread 但是当我通过命令行运行这个curl请求时,它显示了一个错误 {"timestamp":"2020-01-06T03:13:07.899+0000","status":405

我想显示MySQL数据库中以id=275开头的所有消息。我写了一个卷发请求,我不知道。也许请求写得不对。可能是查询语法出错了-

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;
    }
}
RestController

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);
    }
消息服务Impl

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

查看控制器和curl请求,您正在调用/api/unread,它在RestControllergetUnreadMessages中声明为GET请求

假设您想点击POST/api/save,那么只需将curl请求更改为
curl-H内容类型:application/json-d{\messageId\:\275\}localhost:8080/api/save

如果您想调用/api/unread,因为这是一个不需要任何参数的GET请求,那么您只需将其作为
curl-X GET localhost:8080/api/unread-H Content Type:application/json

根据提供的程序代码,端点/api/unread只支持GET,不支持POST。要通过curl设置GET,请添加-X GET:

或者,将endpooint更改为/api/save:


Api save,对他来说,我有另一个curl请求我首先编写了GET示例,因为这个示例引入了一些新的东西-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响应头和一个空正文。确保向curl命令添加-v以查看响应标题。另外,您可以从curl命令中删除body-d{…},因为它不是由endpoint.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错误消息@那么,在这种情况下,您需要修改API本身。按照最佳RESTAPI设计实践,可以将messageId作为API URL本身中的路径参数。如api/unread/{messageId}中所示。然后在控制器中,将messageId读取为@PathVariable Long messageId。基于此messageId,您进行服务调用并返回结果注意HTTP谓词已经包含有关保存等信息;创建对象的常用REST路径就是POST/objects。
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
curl -H "Content-Type: application/json" \
    -d "{ \"messageId\": \"275\" }" \
    localhost:8080/api/save