当前位置: 首页 > 知识库问答 >
问题:

如何在REST API中用GET方法检索资源(对象),在Quarkus中使用date作为@PathParam

程承恩
2023-03-14

我是一个新的编程,我正在尝试建立一个小的饮食跟踪应用程序。我使用quarkus、RESTeasy、JAX-RS和java来构建我的REST API。用户应该能够添加他在一周中几天吃的食物。

用户必须能够根据日期检索他吃过的食物。我的问题是我不能根据日期取回食物。当我使用时间戳:“2021-06-10T08:44:45.9328079Z[UTC]”作为GET方法终点上的输入日期时,我在Postman中得到400个坏请求。当我根据用户ID检索食物时,它工作得很好。

下面是我使用GET和POST方法的代码:

@path(“/foods”)公共类控制器{

public static ArrayList<Object> foods = new ArrayList<>();

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllFood(){
    return Response.ok(foods).build();
}

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addFood() throws ParseException {

    foods.add(new Food("Garlic", 30, Timestamp.from(Instant.now()), 1));
    foods.add(new Food("Onions", 20, Timestamp.from(Instant.now()), 2));
    return Response.ok(foods).build();

}

@Path("{userId}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public static Response getFoodById(@PathParam("userId") int userId){
    for (Object food : foods){
        if (((Food)food).getUserId()==(userId)){
            return Response.ok(food).build();
        }
    }
    return null;
}

@Path("/second/{time}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getFoodByDate(@PathParam("time") Timestamp time){
    for (Object food : foods){
        if (((Food)food).getTime().toString().equals(time.toString())){
            return Response.ok(food).build();
        }
    }
    return null;
}

}

package org.acme;
private String foodType;
private int portion;
private Timestamp time;
private int userId;

public Food(){}

public Food(String foodType, int portion, Timestamp time, int userId){
    this.foodType = foodType;
    this.portion = portion;
    this.time = time;
    this.userId = userId;

}

public String getFoodType() {
    return foodType;
}

public void setFoodType(String foodType) {
    this.foodType = foodType;
}

public int getPortion() {
    return portion;
}

public void setPortion(int portion) {
    this.portion = portion;
}

public Timestamp getTime() {
    return time;
}

public void setTime(Timestamp time) {
    this.time = time;
}

public int getUserId() {
    return userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}

@Override
public String toString(){
    return foodType + ", " + portion + ", " + time + ", " + userId;
}

}

共有1个答案

咸琪
2023-03-14

OK-Postman抛出的错误是400 bad request的原因是由于您的输入参数不正确。

@PathParam更改为@RequestParam的示例代码

@Path("/get/second/")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getFoodByDate(@RequestParam("time") String dateString) throws ParseException{
   ArrayList<Food> foods = new ArrayList<>();
   DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

   Date requestedDate = sdf.parse(dateString);
   for (Object food : foods){
       if (((Food)food).getTime().equals(requestedDate)){
           return Response.ok(food).build();
       }
   }

   return null;
}

在本例中,我将您的时间戳参数更改为java.SQL.timestamp是java.util.date的薄包装器,它允许JDBC API将其标识为SQL时间戳值,因此在本例中不建议使用时间戳。

public class Food {
    private String foodType;
    private int portion;
    private Date time;
    private int userId;

    public Food(){}

    public Food(String foodType, int portion, Date time, int userId){
        this.foodType = foodType;
        this.portion = portion;
        this.time = time;
        this.userId = userId;

    } ... //getter and setter
    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Food food1 = new Food("Garlic", 10, sdf.parse("2020-05-01"), 1);
    Food food2 = new Food("Onion", 20, sdf.parse("2020-05-02"), 1);
    Food food3 = new Food("Potato", 30, sdf.parse("2020-05-03"), 1);
    Food food4 = new Food("Tomato", 40, sdf.parse("2020-05-04"), 1);

    ArrayList<Food> foods = new ArrayList<>();
    foods.add(food1);
    foods.add(food2);
    foods.add(food3);
    foods.add(food4);
package org.example;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws ParseException {

        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = "2020-05-01"; //mocking request date from the @RequestParam
        Date requestedDate = sdf.parse(dateString);

        
        Food food1 = new Food("Garlic", 10, sdf.parse("2020-05-01"), 1);
        Food food2 = new Food("Onion", 20, sdf.parse("2020-05-02"), 1);
        Food food3 = new Food("Potato", 30, sdf.parse("2020-05-03"), 1);
        Food food4 = new Food("Tomato", 40, sdf.parse("2020-05-04"), 1);

        ArrayList<Food> foods = new ArrayList<>();
        foods.add(food1);
        foods.add(food2);
        foods.add(food3);
        foods.add(food4);
        
        for (Object food : foods){
            if (((Food)food).getTime().equals(requestedDate)){
                System.out.print(food);
            }
        }

    }
}

产量:大蒜,10,Fri.5月01 00:00:00 SGT,2020,1

 类似资料:
  • 到目前为止,我只能与Jira建立连接,但我不知道如何获取特定字段。据我所知,JIRA API的SearchResult类可以解决这个问题,但我不知道如何将它集成到我现有的代码中。任何帮助都将不胜感激。 Java版本-8,操作系统-视窗10,日蚀-火星 /*使用的罐子:jersey-bundle-1.9。罐子(https://mvnrepository.com/artifact/com.sun.je

  • 我已经设置了ModelAndView对象 然后,我在JSP中导入了其他助手 然后我尝试使用文档字段作为如下参数 IDEA告诉我那个文件没有解决 堆栈跟踪 在jsp文件中的[44]行发生错误:[/WEB-INF/view/jsp/admin/document_card.jsp]document.pub_date无法解析为类型41: РћРїСѓР±Р"икование 42: 43:

  • 试图从我的php api中获取一个值,在android上,使用截取。。。我的api运行良好,返回了我想要的值,但在我的android上,我似乎可以将值保存在一个变量上。 这是我的php脚本 在我的android studio上,我尝试像这样获取值,我发送3个值插入到数据库中,然后我想将我插入的行的id返回到android。我看过很多关于stackoverflow的答案,但我似乎无法理解和解决我的问

  • 所以我有一个类型为Date的字段,有没有一种方法可以在它的getter方法中将其转换为LocalDateTime?到目前为止我所掌握的是.. 但它似乎不起作用。

  • 问题内容: 我正在尝试将json对象导入变量。我根据教程使用服务。 我收到意外的令牌错误,因为我不应该使用 -但我真的不知道该使用什么。我用谷歌搜索了3个小时,发现只有$ http。或$ json。答案,但是我觉得可以做得更容易-更清晰。 (完美的解决方案是; D 服务文件: 控制器文件: json文件(几乎; D) 编辑: 我将$ resource(’file.json更改为https://ww

  • 我希望通过ContainerRequestFilter中的ExtendedUriInfo检索matchedResources/matchedResults,以便检查路径是否应该受到保护。是否有一种方法可以创建一个在ExtendedUriInfo填充之后,但在调用匹配的资源类和方法之前调用的筛选器?