Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 在Tcl REST的DICT配置数组中使用变量_Arrays_Rest_Dictionary_Tcl - Fatal编程技术网

Arrays 在Tcl REST的DICT配置数组中使用变量

Arrays 在Tcl REST的DICT配置数组中使用变量,arrays,rest,dictionary,tcl,Arrays,Rest,Dictionary,Tcl,如何在tcllib的接口定义变量中使用由两个空格分隔的字符串组成的变量 接口用法指定REST调用定义数组,这些定义本身就是字典 对于这个特定的API,我需要传入从以前的调用中检索到的auth令牌。在定义配置数组时,如何将该值用作变量 set token "Token " append token 123456789ABCD array set restApi { callFoo { url http://example.com/foo method ge

如何在tcllib的接口定义变量中使用由两个空格分隔的字符串组成的变量

接口用法指定REST调用定义数组,这些定义本身就是字典

对于这个特定的API,我需要传入从以前的调用中检索到的auth令牌。在定义配置数组时,如何将该值用作变量

set token "Token "
append token 123456789ABCD

array set restApi {
    callFoo {
        url http://example.com/foo
        method get
        format json
        headers {Auth $token}
   }
}
rest::create_interface restApi
set resultDict [restApi::callFoo]
标头{Auth$token}和标头Auth$token都会导致发送文本Auth:$token标头。同样,头{Auth[set token]}发送Auth:[set token]

数组定义中的变量似乎没有被插值,考虑到大括号的标准行为,这并不完全出乎意料,尽管它们通常用于对多维dict进行分组

在dict headers Auth$token中的$token周围加上引号确实会插入,但我得到以下错误

missing value to go with key
    while executing
"dict for {k val} [dict get $config headers] {
            _addopts $val config
        }"
(procedure "rest::create_interface" line 36)
invoked from within
"rest::create_interface restApi"
(file "t.tcl" line 86)
最初我认为$headers dict中的奇数单词打破了dict。但是从$token中删除空格并不会改变错误

在配置数组之外设置值会导致相同的错误:

dict set restApi(callFoo) headers "Auth $token"
我不知所措。请帮帮我,欧比-万·克诺比。你是我唯一的希望

更新日期:2019年11月30日 事实证明,该实现包括通过将变量名包装为%在config dict中嵌入变量的功能。变量的值可以设置为函数的一个选项:

array set restApi {
    callFoo {
        url http://example.com/foo
        method get
        format json
        headers "Auth %tokenVar%"
    }
}

rest::create_interface restApi
restApi::callFoo -tokenVar $token
还应注意,包允许在调用之前设置这些变量:

restApi::set_static_args tokenVar $token
restApi::callFoo
以这种方式设置的变量将应用于所有已定义的REST调用。因此,如果多个调用需要Auth头,只需将头Auth%tokenVar%添加到每个调用的配置中即可

先前的答案,留给后人 感谢安德烈亚斯,他找到了答案。使用以下语法设置标题dict有效:

array set restApi {
    callFoo {
        url http://example.com/foo
        method get
        format json
    }
}

dict set restApi(callFoo) headers [list Auth $token]
这也适用于:

array set restApi {
    callFoo {
        url http://example.com/foo
        method get
        format json
        headers [list Auth $token]
    }
}

set restApi(callFoo) [subst $restApi(callFoo)]
后一种形式可能更灵活,因为可以在数组定义中使用多个变量,在rest::create_接口调用之前,循环遍历每个元素并执行subst


为了子孙后代,我会注意到,我可能曾经尝试过第一种方法,但是因为我已经注释掉了在restApi数组定义中定义headers dict的一些失败尝试,它破坏了数组。这是因为解析器没有将headers行解释为注释,而是将string headers解释为dict键。

您的示例被破坏,[array set]不正确,首先是不平衡的大括号。请准确地发布您试图运行的代码。更正后,该代码段在我的rest安装版本1.3.1中运行良好。我已更新了该问题,以反映更好地解释该问题的代码。注意,在某些变体中,代码确实会运行,但会发送一个未插入的头字符串。提示:打印restApicallFoo的值。您将看到一个字符串,该字符串指示key header的值为Auth,并且后面有一个key$标记,没有值。使用dict set restApicallFoo headers Auth{$token}可能会起作用。当由于空格等原因,使用双引号进行替换变得困难时,我会使用list和subst等命令。例如Auth$token->[list Auth$token]。少犯错误。谢谢,@Andreas-你给我指明了正确的方向。我根据您的建议提交了我自己的答案,并添加了一些说明。请注意,如果包含大括号,标记的内容可能仍然会破坏代码,例如set token hello}{world。使用list命令[list Auth$token]当替换值必须是特定长度的列表时,确实是最佳选择。而双引号最好仅用于普通字符串。根据@Andreas建议更新了答案以使用[list Auth$token]