Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java springrestapi搜索/过滤的设计_Java_Spring_Rest_Api Design_Spring Rest - Fatal编程技术网

Java springrestapi搜索/过滤的设计

Java springrestapi搜索/过滤的设计,java,spring,rest,api-design,spring-rest,Java,Spring,Rest,Api Design,Spring Rest,我有一个类似这样的URL GET /users?filters[status]=active&filters[org][country]=IND&page[offset]=10&page[limit]=10&include[]=resource1&include[]=resource2 在spring get方法中绑定请求参数的最佳方法是什么?在一个get调用中传递如此多的查询参数是非常不推荐的,如果您有如此多的参数,那么最好转换POST类型的api。

我有一个类似这样的URL

GET  /users?filters[status]=active&filters[org][country]=IND&page[offset]=10&page[limit]=10&include[]=resource1&include[]=resource2

在spring get方法中绑定请求参数的最佳方法是什么?

在一个get调用中传递如此多的查询参数是非常不推荐的,如果您有如此多的参数,那么最好转换POST类型的api。

您可以创建一个筛选器对象,以将主体请求传递给get方法:

Filter : {
    status:"active"
    org : {
           country :"IND"     
           }
...

}

在使用HTTP GET方法时,有两种方法可以在URL中追加查询, @RequestParam&@PathVariable,但两者的方法完全不同。 通过查看URL本身,可以很容易地区分所使用的方法。 在您的情况下,必须使用@RequestParam:

获取/用户?筛选器[状态]=活动筛选器和筛选器[组织][国家]=索引和页面[偏移量]=10&页面[限制]=10&包括[]=resource1&包括[]=resource2

请看下面的代码片段:-

@RequestMapping("/hello")  

    public String display(@RequestParam("name") String name,@RequestParam("pass") String pass,Model m)  
    {  
        if(pass.equals("admin"))  
        {  
            String msg="Hello "+ name;  
            //add a message to the model  
            m.addAttribute("message", msg);  
            return "viewpage";  
        }  
        else  
        {  
            String msg="Sorry "+ name+". You entered an incorrect password";  
            m.addAttribute("message", msg);  
            return "errorpage";  
        }     
    }  
}  
您可以创建一个单独的POJO类,其中包含所有键作为私有字段、getter和setter,并使用@modeldattribute作为方法参数 这将使代码整洁,增加易懂性和便利性

public class POJO{
String resouce1;
String resource2;
//getters & setters
}
在控制器类中:

@RequestMapping(/path)
public String addProduct(@ModelAttribute POJO mypojo)
{
//statements
//statements
}

希望这有帮助。 如果您有任何进一步的疑问,我们将不胜感激


谢谢。

绑定GET API web服务的请求参数取决于业务需求。 当您使用“GET”方法设计restapi时,有两件事需要考虑

1最重要的是使用标准的“获取”方法用于从数据库或任何其他数据存储库检索数据

2绑定请求参数时,应考虑API的要求。根据业务需求,主要有两类参数。强制参数和可选参数。RESTWeb服务也使用路径变量@PathVariable和请求参数@RequestParam映射上述参数类型

3例如,有一个API用于按订单Id搜索订单。因此,如果没有订单Id,则无法搜索订单。订单id应为必填项。在为此用例设计API时,应该使用@PathVariable。这是一个很好的编码实践@PathParam从被调用URI的路径部分读取值

4@RequestParam可用于实现可选参数。请求参数作为键值对传递,因此它们的顺序与多个请求参数无关

5您可以根据需要添加路径变量并请求多个参数

6那么URL取决于路径变量和请求参数。URL设计如下。在添加所有路径变量后添加请求参数,并用问号分隔?您可以使用符号和符号分别添加更多请求参数&

/?requestParamName=

GET方法中PathVariable的实现

@RequestMapping(value = "/orders/{id}", method = RequestMethod.GET)
@ResponseBody
public String getOrder(@PathVariable final String id) {
  return "Order ID: " + id;
}
@RequestMapping("/trades", method = RequestMethod.GET)
public String showTradeDetails(@RequestParam String tradeId,Model model){
  model.addAttribute("tradeId", tradeId);
  return "tradeDetails";
}
GET方法中RequestParam的实现

@RequestMapping(value = "/orders/{id}", method = RequestMethod.GET)
@ResponseBody
public String getOrder(@PathVariable final String id) {
  return "Order ID: " + id;
}
@RequestMapping("/trades", method = RequestMethod.GET)
public String showTradeDetails(@RequestParam String tradeId,Model model){
  model.addAttribute("tradeId", tradeId);
  return "tradeDetails";
}
在本文中,我解释了如何为搜索开发RESTAPI。例如,您可以在本文中找到postman的代码和屏幕截图。 在live中测试API也可能是这样的:

作为一个端点的优化,我可以得到几个结果:对资源进行排序、筛选和分页


您不需要对查询参数和控制器中的所有控件进行大量代码检查:库规范arg resolver确保这一点没有问题

请您给出任何解释或参考,为什么不推荐此操作?是的,当然,希望您了解安全问题。到目前为止,您是否已经向该API添加了某种授权,如果没有,那么当您通过整个大查询参数进行GET调用时,您将在浏览器中突出显示相同的授权,并且只需篡改API请求,其他一些用户的数据就可以得到。为了避免同样的情况,如果您将API调用转换为POST类型,这不仅可以避免整个长查询参数,而且POST调用也是安全的。我在您的回答中缺少的是过滤器[status]在函数中的映射方式。