将可选的查询字符串参数传递给http服务调用

问题描述 投票:1回答:4

我需要进行API调用,这允许我通过可选的查询sting参数

 retrieveConts(param1:string,param2?:string):Observable<IContracts> {  
  this.basePath =  "/myConts"; 
      return http.get(this.basePath,{ 
      params: {  
       arg1:param1,
       arg2:param2,
      },
      withCredentials: false
    }) 
     .catch(this._errorHandler); 
  }

使用上面的代码spinet,我已经将param2声明为可选参数,可以或不可以传递给服务调用,但是如果param2没有值,则返回undefined,这是可以理解的。

如果没有从param2变量返回值,如何使服务调用忽略“arg2”参数?

angular angular5 angular-httpclient
4个回答
1
投票

你可以这样做:

retrieveConts(param1:string,param2?:string):Observable<IContracts> {  
    this.basePath =  "/myConts"; 
    let params = {arg1: param1};
    if (param2)
        params = {arg1: param1, arg2: param2};

    return http.get(this.basePath, { 
        params: params,
        withCredentials: false
    }) 
    .catch(this._errorHandler); 
}

希望这会有所帮助!


1
投票

而不是在组件中传递两个值,您可以传递一个对象

//假设userService是组件中的服务//代码

userService.retrieveConts({arg1:"val1",arg2:"val2"})

// userService中的代码

retrieveConts(param:any):Observable<IContracts> {  
  this.basePath =  "/myConts"; 
      return http.get(this.basePath,{ 
      params: param,
      withCredentials: false
    }) 
     .catch(this._errorHandler); 
  }

或者您也可以检查param2并将其附加到对象

retrieveConts(param1:string,param2?:string):Observable<IContracts> {  
    this.basePath =  "/myConts"; 
    let params = {arg1: param1};
    if (param2) params.arg2 = param2;

        return http.get(this.basePath, { 
            params: params,
            withCredentials: false
        }) 
        .catch(this._errorHandler); 
    }

如果param2未定义或为null,则传递空val

retrieveConts(param1:string,param2?:string):Observable<IContracts> {  
        this.basePath =  "/myConts"; 

            return http.get(this.basePath, { 
                params: {arg1: param1, arg2: param2 || ''},
                withCredentials: false
            }) 
            .catch(this._errorHandler); 
        }

要么

  retrieveConts(param1:string,param2?:string=""):Observable<IContracts> {
           this.basePath =  "/myConts"; 

            return http.get(this.basePath, { 
                params: {arg1: param1, arg2: param2},
                withCredentials: false
            }) 
            .catch(this._errorHandler); 
        }

1
投票

你可以尝试这样的事情:

retrieveConts(p1,p2?): Observable<IContracts> {
    this.basePath =  "/myConts";
    let params = {argument1: p1};
    if (p2)
        params = {argument1: p1, argument2: p2};

    return http.get(this.basePath, {
        params: params,
        withCredentials: false
    })
    .catch(this._errorHandler);
 }

0
投票

切换到对象定义以缩短代码(其他解决方案会使代码更长):

retrieveConts(params: { [key: string]: value: string }) {
  return http
    .get('/myConts', { 
      params,
      withCredentials: false
    }) 
    .catch(this._errorHandler); 
}

该参数被声明为一个对象,它可以包含一个带字符串值的字符串键,并直接将其作为URL的参数传递(具有相同名称的属性不需要写入两次)

© www.soinside.com 2019 - 2024. All rights reserved.