Java Curl命令不工作(Spring启动项目)
我想显示MySQL数据库中以id=275开头的所有消息。我写了一个卷发请求,我不知道。也许请求写得不对。可能是查询语法出错了-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
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