簡體   English   中英

如何匹配兩個 API 以使用 Python 更新一個 API 數據集

[英]How to Match two APIs to update one API dataset using Python

I want to be able to GET information from API 1 and match it with API 2 and be able to update API 2's information with API 1. I am trying to figure out the most efficient/automated way to accomplish this as it also needs to be每 10 分鍾更新一次

我可以從 API 1 查詢並獲取結果,這是我的代碼和我的代碼的樣子。

import json
import requests

myToken = '52c32f6588004cb3ab33b0ff320b8e4f'
myUrl = 'https://api1.com/api/v1/devices.json'
head = {'Authorization': 'Token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)
r = json.loads(response.content)
r

有效載荷從 API 1 看起來像這樣

{ "device" : {
"id": 153,
"battery_status" : 61,
"serial_no": "5QBYGKUI05",
"location_lat": "-45.948917",
"location_lng": "29.832179",
"location_address": "800 Laurel Rd, Lansdale, PA 192522,USA"}
}

我希望能夠獲取此信息並通過“serial_no”進行匹配,並更新 API 2 中相應設備的所有其他信息

我查詢 API 2 的數據,這就是我的代碼的樣子


 params = {
        "location":'cf6707e3-f0ae-4040-a184-737b21a4bbd1',
         "dateAdded":'ge:11/23/2020'}
url = requests.get('https://api2.com/api/assets',auth=('api2', '123456'), params=params)
r = json.loads(url.content)
r['items']

JSON 有效載荷如下所示

[{'id': '064ca857-3783-460e-a7a2-245e054dcbe3',
  'name': 'Apple Laptop 1',
  'model': {'id': '50f5993e-2abf-49c8-86e0-8743dd58db6f',
   'name': 'MacBook Pro'},
  'manufacturer': {'id': 'f56244e2-76e3-46da-97dd-f72f92ca0779',
   'name': 'APPLE'},
  'room': {'id': '700ff2dc-0118-46c6-936a-01f0fa88c620',
   'name': 'Storage Room 1',
   'thirdPartyId': ''},
  'location': {'id': 'cf6707e3-f0ae-4040-a184-737b21a4bbd1',
   'name': 'Iron Mountain',
   'thirdPartyId': ''},
  'position': 'NonMounted',
  'containerAsset': {'id': '00000000-0000-0000-0000-000000000000',
   'name': None},
  'baseAsset': {'id': '064ca857-3783-460e-a7a2-245e054dcbe3',
   'name': 'Apple Laptop 1'},
  'description': None,
  'status': {'id': 'df9906d8-2856-45e3-9cba-bd7a1ac4971f',
   'name': 'Production'},
  'serialNumber': '5QBYGKUI06',
  'tagNumber': None,
  'alternateTagNumber': None,
  'verificationStatus': {'id': 'cb3560a9-eef5-47b9-b033-394d3a09db18',
   'name': 'Verified'},
  'requiresRFID': False,
  'requiresHangTag': False,
  'bottomPosition': 0.0,
  'leftPosition': 0.0,
  'rackPosition': 'Front',
  'labelX': None,
  'labelY': None,
  'verifyNameInRear': False,
  'verifySerialNumberInRear': False,
  'verifyBarcodeInRear': False,
  'isNonDataCenter': False,
  'rotate': False,
  'customer': {'id': '00000000-0000-0000-0000-000000000000', 'name': None},
  'thirdPartyId': '',
  'temperature': None,
  'dateLastScanned': None,
  'placement': 'Floor',
  'lastScannedLabelX': None,
  'lastScannedLabelY': None,
  'userDefinedValues': [{'userDefinedKeyId': '79e77a1e-4030-4308-a8ff-9caf40c04fbd',
    'userDefinedKeyName': 'Longitude ',
    'value': '-75.208917'},
   {'userDefinedKeyId': '72c8056e-9b7d-40ac-9270-9f5929097e82',
    'userDefinedKeyName': 'Address',
    'value': '800 Laurel Rd, New York ,NY 19050, USA'},
   {'userDefinedKeyId': '31aeeb91-daef-4364-8dd6-b0e3436d6a51',
    'userDefinedKeyName': 'Battery Level',
    'value': '67'},
   {'userDefinedKeyId': '22b7ce4f-7d3d-4282-9ecb-e8ec2238acf2',
    'userDefinedKeyName': 'Latitude',
    'value': '35.932179'}]}

API 2 提供的文檔告訴我,他們目前僅支持 PUT 進行更新,但我也想知道如何使用 PATCH 來做到這一點,因為它將在未來可用。 所以我需要成功 PUT 的數據有效負載是這個

payload = {'id': '064ca857-3783-460e-a7a2-245e054dcbe3',
 'name': 'Apple Laptop 1',
 'model': {'id': '50f5993e-2abf-49c8-86e0-8743dd58db6f',
  'name': 'MacBook Pro'},
 'manufacturer': {'id': 'f56244e2-76e3-46da-97dd-f72f92ca0779',
  'name': 'APPLE'},
 'room': {'id': '700ff2dc-0118-46c6-936a-01f0fa88c620',
  'name': 'Storage Room 1',
  'thirdPartyId': ''},
 'status': {'id': 'df9906d8-2856-45e3-9cba-bd7a1ac4971f',
  'name': 'Production'},
 'serialNumber': '5QBYGKUI06',
 'verificationStatus': {'id': 'cb3560a9-eef5-47b9-b033-394d3a09db18',
  'name': 'Verified'},
 'requiresRFID': 'False',
 'requiresHangTag': 'False',
 'userDefinedValues': [{'userDefinedKeyId': '79e77a1e-4030-4308-a8ff-9caf40c04fbd',
   'userDefinedKeyName': 'Longitude ',
   'value': '-75.248920'},
  {'userDefinedKeyId': '72c8056e-9b7d-40ac-9270-9f5929097e82',
   'userDefinedKeyName': 'Address',
   'value': '801 Laurel Rd, New York, Ny 192250, USA'},
  {'userDefinedKeyId': '31aeeb91-daef-4364-8dd6-b0e3436d6a51',
   'userDefinedKeyName': 'Battery Level',
   'value': '67'},
  {'userDefinedKeyId': '22b7ce4f-7d3d-4282-9ecb-e8ec2238acf2',
   'userDefinedKeyName': 'Latitude',
   'value': '29.782177'}]}

因此,除此之外,我還要弄清楚如何查詢更新所需的 json 數據部分

我可以使用此行更新信息

requests.put('https://api2.com/api/assets/064ca857-3783-460e-a7a2-245e054dcbe3',auth=('API2', '123456'), data=json.dumps(payload))

但我需要它動態更新,所以我不認為行中的硬編碼 id 參數在自動化/效率的角度是有效的。 如果有人有任何想法,將不勝感激能夠為我指明正確方向以了解更多有關此過程的資源(我什至不知道它叫什么)。

不完全確定您在這里嘗試做什么,但如果您想提取嵌套在響應中的信息,您可以這樣做。

來自 API 的序列號 1

r['device']['serial_no']

API 2 的序列號

either r[0]['serialNumber'] or r['items'][0]['serialNumber'] depending on what you are showing

修改有效載荷序列號,例如

payload['serialNumber'] = '123456abcdef'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM