【问题标题】:Angular Typescript send optional restful url params only if they are not emptyAngular Typescript 仅在它们不为空时才发送可选的 restful url 参数
【发布时间】:2018-06-09 09:20:55
【问题描述】:

我可以控制的当前系统只是前端,即 Angular 5(因此是 Typescript)。后端应该无关紧要,但是有一个团队不会更改签名、错误处理等。:/

问题是有一个只需要 1 个字段的搜索屏幕,所以当我尝试将 URL 发送到 Restful 后端时(实际上当我输入这个时......这并不是真的很安静,是吗?)

我的 Angular 服务方法:

getSearchByUserResults(first,last,user,eff,term,emp) {

       //IF I JUST DO THIS, THEN EMPTY PARAMS ARE SENT AND SOMEHOW THE BACKEND IS NOT SET UP TO HANDLE THAT  :/ 
       //var params = "userid=" + user + "&first-name=" + first + "&last-name=" + last + "&eff-date=" + eff + "&term-date=" + term + "&employee-id=" + emp;

    //Sending only userid works
    //var params = "userid=" + user;

    // Send user and first when first name is empty(null) again it does NOT work
    var params = "userid=" + user + "&first-name=" + first;



    var searchUser = this._searchByUser + params;


    return this._http.get(searchUser).map((response: Response) => response.json()).catch(this.handleError);
}

基本上我所展示的是上面的 cmets。

如果一个参数为空或 null,那么我不希望它被添加到发送到服务器控制器方法的参数列表中......

  1. 如果用户 = 123 发送http://server.com:9080//rest/config/users?userid=123
  2. 如果用户和名字不为空发送http://server.com:9080//rest/config/users?userid=123&first-name=Ted
  3. 永远不要发送带有空参数的东西,比如空的名字http://server.com:9080//rest/config/users?userid=123&first-name=

基于该参数列表,如果没有一堆 if 语句检查 null/empty/undefined ,我该如何做到这一点?

first,last,user,eff,term,emp

【问题讨论】:

  • 从您的代码看来,您仍在使用旧的Http 包而不是HttpClient,因此我建议您将其换掉。完成后,您可以使用 HttpParams 对象:angular.io/guide/http#url-parameters
  • 当然,但是没有旧 Http 的例子吗?
  • 是的,但你会使用一些自 4.3 以来已被弃用的代码,并将在 Angular 的未来版本中删除
  • 你能给我看一个例子吗?

标签: javascript angular rest typescript parameter-passing


【解决方案1】:

事实证明,我误读了文档,HttpParams 不会自动删除空值。

但是,您可以为此使用数组函数:

getParams(first,last,user,eff,term,emp): HttpParams {
    let obj = {first, last, user, eff, term, emp};
    return Object.keys(obj).reduce((params, key) => 
            obj[key] ? params.append(key, obj[key]) : params, new HttpParams())
}

这将构建一个仅包含真值的 HttpParams 对象,因此它将排除 null / undefined / 空字符串等。

请记住,false0 也是错误值 - 我不确定这是否会成为您的用例中的问题。

【讨论】:

  • 太棒了!因此,为了保留正确的参数,我实际上必须更改的唯一一件事就是将 let 语句更改为:let obj = {'first-name':first, 'last-name': last, 'userid':user,'eff-date': eff,'term-date': term,'employee-id': emp};
猜你喜欢
  • 2019-02-23
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多