【问题标题】:How to transform PageRequest object to query string?如何将 PageRequest 对象转换为查询字符串?
【发布时间】:2016-10-01 15:43:52
【问题描述】:

我正在编写一个 RESTful API,它使用另一个 RESTful Data API,并且我正在使用 Spring Data。

客户端使用如下查询参数发送页面请求:
http://api.mysite.com/products?page=1&size=20&sort=id,asc&sort=name,desc

我将 params 转换为 PageRequest 对象并将其传输到服务层。

在服务中,我想使用 TestTemplate 与使用 URL 的数据 API 进行交互,以及 如何将 PageRequest 对象转换为查询字符串,如

page=1&size=20&sort=id,asc&sort=name,desc

然后我可以请求如下数据:

restTemplate.getForEntity("http://data.mysite.com/products?page=1&size=20&sort=id,asc&sort=name,desc",String.class)                    

【问题讨论】:

    标签: rest spring-data spring-data-jpa


    【解决方案1】:

    我知道我在这个答案上有点晚了,但我也无法找到一种已经实现的方法来做到这一点。我最终为此开发了自己的例程:

    public static String encodeURLComponent(String component){
        try {
            return URLEncoder.encode(component, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("You are dumm enough that you cannot spell UTF-8, are you?");
        }
    }
    
    public static String queryStringFromPageable(Pageable p){
        StringBuilder ans = new StringBuilder();
        ans.append("page=");
        ans.append(encodeURLComponent(p.getPageNumber() + ""));
    
        // No sorting
        if (p.getSort() == null)
            return ans.toString();
    
        // Sorting is specified
        for(Sort.Order o : p.getSort()){
            ans.append("&sort=");
            ans.append(encodeURLComponent(o.getProperty()));
            ans.append(",");
            ans.append(encodeURLComponent(o.getDirection().name()));
        }
    
        return ans.toString();
    }
    

    它并不完整,我可能遗漏了一些细节,但对于我的用户案例(我认为对于大多数用户而言)这是可行的。

    【讨论】:

      【解决方案2】:

      你可以通过新的:

      new PageRequest(int page,int size)

      在存储库层你可以写成:

      Page<User> findByName(String name,Pageable page)
      

      您必须通过 new PageRequest(int page,int size)

      代替 Pageable page

      对于升序,您可以参考:

      List<Todo> findByTitleOrderByTitleAsc(String title);
      

      【讨论】:

      • 我想你没有得到我的问题,我的api需要将请求参数转移到另一个restful api。
      【解决方案3】:

      我认为您只需要遍历来自其他 API 请求的请求参数,然后将所有参数值传递到新的 Url 中以进行新的 API 请求。

      sudo 代码可以是:

      //all query params can be found in Request.QueryString
      var queryParams = Request.QueryString; 
      
      private string ParseIntoQuery(NameValueCollection values)
      {
         //parse the identified parameters into a query string format 
         // (i.e. return "?paramName=paramValue&paramName2=paramValue2" etc.)
      }
      

      在您的代码中,您将执行以下操作:

      restTemplate.getForEntity(urlAuthority + ParseIntoQuery(Request.QueryString));
      

      就这么简单。希望得到答案?

      【讨论】:

        【解决方案4】:
        UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl("http://data.mysite.com/products");
        
            addRequestParam(uriComponentsBuilder, "page", pageable.getPageNumber());
            addRequestParam(uriComponentsBuilder, "size", pageable.getPageSize());
        
            String uri = uriComponentsBuilder.toUriString() + sortToString(pageable.getSort());
        

        addRequestParam 方法:

        private static void addRequestParam(UriComponentsBuilder uriBuilder, String parameterName, Object parameter) {
            if (parameter != null) {
                uriBuilder.queryParam(parameterName, parameter);
            }
        }
        

        实现 sortToString(Sort sort) 方法为@Shalen。你必须得到这样的东西:&sort=name,asc&sort=name2,desc。如果 Sort 为 null,则返回 "";

        【讨论】:

          猜你喜欢
          • 2013-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-03
          相关资源
          最近更新 更多