首页 > 解决方案 > 如何使用以下列表条目创建 REST API 请求详细信息 - 在 Python 中

问题描述

以下是我从源代码中获得的列表。

[("!!cm.mymodel.ucm.model.uCConf.UCConf\nrequests:\n- &id001\n  dMD:\n    cA: {}\n    descMap: {en: R Des}\n    dispNm: {en: Rq Nm}\n    sysAt: {}\n  id: R_I_001\n  para:\n    mt: gSoCamgSoCam\n    cT: 1\n    cttSceId: ['2']\n    aMarB: fl\n    maxR: 2\n  pR: null\n  reqCon: {reqTy: GET}\nuCs:\n- dMD:\n    cA: {}\n    descMap: {}\n    dispNm: {en: gm_tt_SedCa}\n    sysAt:\n      undefined: {enabled: fl}\n  reqCktl:\n  - dMD:\n      cA: {}\n      descMap: {}\n      dispNm: {en: Default}\n      sysAt: {}\n    id: gm_tt_SedCa_0\n    reqL:\n    - *id001\n    slpara: {spPeMin: 1, spPerMx: 100}\n  stUCad: GM_19_02-01-2019_236166987\n  uCaId: gm_tt_SedCa\nversion: '1.0'\n",), ("!!cm.mymodel.ucm.model.uCConf.UCConf\nrequests:\n- &id001\n  dMD:\n    cA: {}\n    descMap: {en: R Des}\n    dispNm: {en: Rq Nm}\n    sysAt: {}\n  id: R_I_001\n  para:\n    mt: GTEdRec\n    cT: 1\n    cttSceId: ['2']\n    aMarB: fl\n  pR: null\n  reqCon: {reqTy: GET}\nuCs:\n- dMD:\n    cA: {}\n    descMap: {}\n    dispNm: {en: ult Picks}\n    sysAt: {}\n  reqCktl:\n  - dMD:\n      cA: {}\n      descMap: {}\n      dispNm: {en: Default}\n      sysAt: {}\n    id: ult/ult_pi_var_0\n    reqL:\n    - *id001\n    slpara: {spPeMin: 1, spPerMx: 100}\n  stUCad: ult/ult_Picks_11-01-2019_1003834703\n  uCaId: ult/gm_tt_SedCa\nversion: '1.0'\n",), ("!!cm.mymodel.ucm.model.uCConf.UCConf\nrequests:\n- &id001\n  dMD:\n    cA: {}\n    descMap: {en: R Des}\n    dispNm: {en: Rq Nm}\n    sysAt: {}\n  id: R_I_001\n  para:\n    mt: GTEdRec\n    cT: 1\n    cttSceId: ['2']\n    aMarB: fl\n    campaignIds: gm_tt_SedCa_2018\n    maxR: 3\n  pR: null\n  reqCon: {reqTy: GET}\nuCs:\n- dMD:\n    cA: {}\n    descMap: {}\n    dispNm: {en: Vik Sea 2017}\n    sysAt:\n      taUsecaseDateRange: {enabled: fl}\n  reqCktl:\n  - dMD:\n      cA: {Cat: Ed}\n      descMap: {}\n      dispNm: {en: Default}\n      sysAt: {}\n    id: ult/gm_tt_SedCa8-copy_variant_0\n    reqL:\n    - *id001\n    slpara: {spPeMin: 1, spPerMx: 100}\n  stUCad: ult/gm_tt_SedCa_2018-Copy_11-01-2017_1003834668\n  uCaId: ult/gm_tt_SedCa-Copy\nversion: '1.0'\n",)]

我需要使用该列表来创建 REST URL,例如

URL: http://<url>/<use value in-front of uCaId> 
Method:<use value available for reqTy>
Req Body: { 
"rParam": { 
 "cItId":["[<use cttSceId>]<random id>"]
  "aMarB":<use value for aMarB>
 } 
}

所以它应该遍历并在这种情况下给我 3 个 URL。(稍后我计划将其传递给 PyTest 断言)
不确定如何使用 Python 实现这一点。谁能帮忙?

PS:从我尝试过的评论建议

import yaml

descriptors1 = [
    [(
     "!!cm.mymodel.ucm.model.uCConf.UCConf\nrequests:\n- &id001\n  dMD:\n    cA: {}\n    descMap: {en: R Des}\n    dispNm: {en: Rq Nm}\n    sysAt: {}\n  id: R_I_001\n  para:\n    mt: gSoCamgSoCam\n    cT: 1\n    cttSceId: ['2']\n    aMarB: fl\n    maxR: 2\n  pR: null\n  reqCon: {reqTy: GET}\nuCs:\n- dMD:\n    cA: {}\n    descMap: {}\n    dispNm: {en: gm_tt_SedCa}\n    sysAt:\n      undefined: {enabled: fl}\n  reqCktl:\n  - dMD:\n      cA: {}\n      descMap: {}\n      dispNm: {en: Default}\n      sysAt: {}\n    id: gm_tt_SedCa_0\n    reqL:\n    - *id001\n    slpara: {spPeMin: 1, spPerMx: 100}\n  stUCad: GM_19_02-01-2019_236166987\n  uCaId: gm_tt_SedCa\nversion: '1.0'\n",),
     (
     "!!cm.mymodel.ucm.model.uCConf.UCConf\nrequests:\n- &id001\n  dMD:\n    cA: {}\n    descMap: {en: R Des}\n    dispNm: {en: Rq Nm}\n    sysAt: {}\n  id: R_I_001\n  para:\n    mt: GTEdRec\n    cT: 1\n    cttSceId: ['2']\n    aMarB: fl\n  pR: null\n  reqCon: {reqTy: GET}\nuCs:\n- dMD:\n    cA: {}\n    descMap: {}\n    dispNm: {en: ult Picks}\n    sysAt: {}\n  reqCktl:\n  - dMD:\n      cA: {}\n      descMap: {}\n      dispNm: {en: Default}\n      sysAt: {}\n    id: ult/ult_pi_var_0\n    reqL:\n    - *id001\n    slpara: {spPeMin: 1, spPerMx: 100}\n  stUCad: ult/ult_Picks_11-01-2019_1003834703\n  uCaId: ult/gm_tt_SedCa\nversion: '1.0'\n",),
     (
     "!!cm.mymodel.ucm.model.uCConf.UCConf\nrequests:\n- &id001\n  dMD:\n    cA: {}\n    descMap: {en: R Des}\n    dispNm: {en: Rq Nm}\n    sysAt: {}\n  id: R_I_001\n  para:\n    mt: GTEdRec\n    cT: 1\n    cttSceId: ['2']\n    aMarB: fl\n    campaignIds: gm_tt_SedCa_2018\n    maxR: 3\n  pR: null\n  reqCon: {reqTy: GET}\nuCs:\n- dMD:\n    cA: {}\n    descMap: {}\n    dispNm: {en: Vik Sea 2017}\n    sysAt:\n      taUsecaseDateRange: {enabled: fl}\n  reqCktl:\n  - dMD:\n      cA: {Cat: Ed}\n      descMap: {}\n      dispNm: {en: Default}\n      sysAt: {}\n    id: ult/gm_tt_SedCa8-copy_variant_0\n    reqL:\n    - *id001\n    slpara: {spPeMin: 1, spPerMx: 100}\n  stUCad: ult/gm_tt_SedCa_2018-Copy_11-01-2017_1003834668\n  uCaId: ult/gm_tt_SedCa-Copy\nversion: '1.0'\n",)]
]

a = yaml.dump(descriptors1,explicit_start=True, default_flow_style=False) ## a is type 'str' and giving o
#a = yaml.safe_dump(descriptors1,explicit_start=True, default_flow_style=False)

class PSLoader(yaml.SafeLoader):
    def construct_python_tuple(self, node):
        return tuple(self.construct_sequence(node))

PSLoader.add_constructor(
    u'tag:yaml.org,2002:python/tuple',
    PSLoader.construct_python_tuple)


yamlholder = yaml.load(a, Loader=PSLoader)

print(yamlholder)

现在 yamlholderis 类型为“列表”

和op是这样的 op is [("!!cm.mymodel.ucm.model.uCConf.UCConf\nrequests:\n- &id001\n dMD:\n cA: {}\n descMap: {en: Rq Nm}\n dispNm: {en: Rq Nm}\n sysAt: {}\n id: REQ_ID_001\n para:\n mT: getSortedCampaigns\n cT: 1\n cttSceId: ['2']\n aMarB: false\n maxR: 2\n pR: null\n reqCon: {reqTy: GET}\nuCs:\n- dMD:\n cA: {}\n descMap: {}\n dispNm: {en: gm_tt_SedCa}\n sysAt:\n undefined: {enabled: fl}\n reqCktl:\n - dMD:\n cA: {}\n descMap: {}\n dispNm: {en: Default}\n sysAt: {}\n id: gm_tt_SedCa_0\n reqL:\n - *id001\n slpara: {spPeMin: 1, spPerMx: 100}\n stUCad: GM_19_02-01-2019_236166987\n uCaId: m_tt_SedCa\nversion: '1.0'\n",), ...........)]

标签: pythonrest

解决方案


在您的代码中,您首先将数据(这是一个列表)转储到 yaml,然后将其解析回来。难怪你又得到了一份清单。相反,您需要先从列表中提取 yaml,然后对其进行解析:

class PSLoader(yaml.SafeLoader):
    pass

def constructor(loader, node):
    return loader.construct_mapping(node)

# to handle the custom tag
PSLoader.add_constructor(
    'tag:yaml.org,2002:cm.mymodel.ucm.model.uCConf.UCConf', 
    constructor
)

for entry, in descriptors1[0]:
    parsed = yaml.load(entry, Loader=PSLoader)
    print(parsed)

然后你会看到解析后的条目是字典,你可以用它来发送请求。


推荐阅读