Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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
Python 修订版中没有客户端id的处理器不允许通过REST-API进行PUT更新_Python_Rest_Apache Nifi - Fatal编程技术网

Python 修订版中没有客户端id的处理器不允许通过REST-API进行PUT更新

Python 修订版中没有客户端id的处理器不允许通过REST-API进行PUT更新,python,rest,apache-nifi,Python,Rest,Apache Nifi,我想更新处理器的状态。我可以通过/nifi api/processors/proc_id上的GET请求成功检索处理器的当前状态 我得到了以下JSON: {"revision":{"version":1},"id":"cd55-processor-id-03ab4","uri":" ..." .... 当我尝试将新状态写回Nifi时,在/processors/{id}/run

我想更新处理器的状态。我可以通过
/nifi api/processors/proc_id
上的
GET
请求成功检索处理器的当前状态

我得到了以下JSON:

{"revision":{"version":1},"id":"cd55-processor-id-03ab4","uri":" ..." ....
当我尝试将新状态写回Nifi时,在
/processors/{id}/run status
上放置
时出现问题-我收到以下错误:

b'Node [....] is unable to fulfill this request due to: [3, cd55-processor-id-03ab4] 
    is not the most up-to-date revision. This component appears to have been modified'
我的代码:

# Get node for current version
response = requests.get(url_nifi_api + f'processors/{processor_id}'
                        , headers=header
                        , verify=False)
processor = json.loads(response.content)
# increment for new state
proc_version_inc = processor['revision']['version'] + 1 
put_dict = {"revision": {"version": proc_version_inc}, "state": new_state, "disconnectedNodeAcknowledged": True}  

payload = json.dumps(put_dict).encode('utf8')
response = requests.put(url_nifi_api + 'processors/' + processor_id + '/run-status', headers=header, data=payload)
因此,我认为问题在于我需要在修订版中传递
clientId
(尽管有人说这是一个可选属性),但处理器没有客户机ID

这是我的带有客户机ID的代码-这适用于客户机ID存在于
GET
JSON中的处理器。

processor= json.loads(requests.get(url_nifi_api + f'processors/{processor_id}'
                        , headers=header
                        , verify=False).content)
# get result for instance:  {"revision":{"clientId":"60b-00d0-client-id-37c","version":4}, ....

client_id = processor['revision']['clientId']
proc_version_inc = processor['revision']['version'] + 1  # in this example: 4+1
put_dict = {"revision": {"clientId": client_id, "version": proc_version_inc}, 
            "state": new_state, "disconnectedNodeAcknowledged": True}
此处理器与其他处理器之间的唯一区别是,其他处理器在处理器的
GET
JSON中没有
clientId
。但是,即使我明确地将
clientId
设置为空字符串(或者使用现有的
clientId
从处理器复制),它也会给我同样的错误


到目前为止,我找到的唯一解决方案是在Web UI中手动更改处理器,之后处理器有一个客户机id,代码就可以运行了。我真的不想每次出错都这样做。有人有什么想法吗?

因此,@yaprak在评论中是正确的-将未递增的版本号发回工作。不过这种行为有点奇怪,所以我想最简单的方法就是永远不要手动更改处理器的
版本

  • 如果存在
    clientId
    版本号
    ,则可以手动增加所需的版本

  • 如果存在
    客户端ID
    且只有
    版本号
    ,则Nifi不允许任何版本增量


  • 我认为问题在于版本。您在proc_version_inc var中有什么价值?我应该在哪里找到这个版本?处理器上的
    GET
    返回的JSON中不存在这样的变量。啊,你是说我的变量
    proc\u version\u inc
    是我在
    GET
    请求期间从处理器检索到的版本号,并按
    1
    @Cribber递增。您不应该递增版本,nifi会这样做。只要把你从那里得到的东西寄出去就行了