相同URI参数的多个值

时间:2019-08-07 10:16:03

标签: oracle rest oracle-apex oracle-ords

我正在通过APEX使用ORDS(v18.3)创建一个API,我需要能够为同一个参数传递多个值,例如:

https://server-url/resource?id=1&id=2

这是第三方要求,无法更改。

当我尝试使用这样的URL时,只会传递第一个参数,而第二个则被删除。

使用ORDS是否可以完成我需要做的事情?

2 个答案:

答案 0 :(得分:3)

我有一个类似的问题,可以通过简单地处理查询字符串来解决。

创建了一个函数

create or replace function array_from_oldschool(p_query_string in varchar2, p_key in varchar2) return apex_t_varchar2 is
  l_ret     apex_t_varchar2 := apex_t_varchar2();
  l_usenext boolean := false;
  l_isval   boolean := false;
  l_arr     apex_t_varchar2;
begin
  l_arr := apex_string.split(p_query_string, '\s*[=&]\s*');
  for i in 1 .. l_arr.count loop
    if l_usenext = true and l_isval = true then
      l_ret.extend;
      l_ret(l_ret.count) := l_arr(i);
      l_usenext := false;
    end if;

    if l_arr(i) = p_key and l_isval = false then
      l_usenext := true;
    end if;

    l_isval := not (l_isval);
  end loop;

  return l_ret;
end;

要进行测试:创建ORDS GET服务,请输入PL / SQL

declare
  l_arr apex_t_varchar2;
begin
  l_arr := array_from_oldschool(p_query_string => owa_util.get_cgi_env('QUERY_STRING'), p_key => 'id');

  for i in 1 .. l_arr.count loop
    htp.prn(l_arr(i) || ' <br>');
  end loop;
end;

测试:GET testme / old-school?id = 1&id = 2&id = 10&id = 100&id = 99

输出为:

1
2
10
100
99

您将需要更改一些代码,从使用owa_util.ident_arr到类似apex_T_varchar2的Varchar2的表。但这应该是最小的。

问候 奥拉富尔

*编辑* 此功能更好,因为如果查询字符串的参数为空(即val =&val2 =&val4 =),则另一个函数会搞乱

create or replace function query_string_array(p_key in varchar2) return apex_t_varchar2 is
  l_query_string apex_t_varchar2;
  l_return       apex_t_varchar2 := apex_t_varchar2();
begin
  l_query_string := apex_string.split(owa_util.get_cgi_env('QUERY_STRING'), '&');
  for i in 1 .. l_query_string.count loop
    if l_query_string(i) like p_key || '=%' then
      if replace(l_query_string(i), p_key || '=', '') is not null then
        l_return.extend;
        l_return(l_return.count) := replace(l_query_string(i), p_key || '=', '');
      end if; --don't add empty/null values
    end if;
  end loop;
  return l_return;
end;

答案 1 :(得分:0)

据我所知,您可以传递任意数量的值,但所有值都应属于同一参数,并用冒号分隔。就您而言,应该是

https://server-url/resource?id=1:2

这还意味着您之后必须以某种方式“拆分”它们才能获得单独的值。

当我从Apex调用报表(由Oracle Reports开发)时,我曾用过它。在参数格式后的触发器中拆分这些值不是问题,但是-我不知道您是否可以这样做。

希望有人会比我更了解。