Как сопоставить два API для обновления одного набора данных API с помощью Python

#python #json #api #python-requests #put

#python #json #API #python-запросы #поместите

Вопрос:

Я хочу иметь возможность ПОЛУЧАТЬ информацию из API 1 и сопоставлять ее с API 2, а также иметь возможность обновлять информацию API 2 с помощью API 1. Я пытаюсь найти наиболее эффективный / автоматизированный способ достижения этой цели, поскольку его также необходимо обновлять с интервалом каждые 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, поскольку он будет доступен в будущем. Итак, полезная нагрузка данных, которую мне нужно успешно ПОМЕСТИТЬ, такова

 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 в строке будет эффективным с точки зрения автоматизации / эффективности. Если у кого-нибудь есть какие-либо идеи, ресурсы, которые укажут мне правильное направление, чтобы узнать больше об этом процессе (я даже не знаю, как он называется), я был бы очень признателен.

Ответ №1:

Не совсем уверен, что вы пытаетесь здесь сделать, но если вы хотите извлечь информацию, вложенную в ответы, вы можете это сделать.

Серийный номер из 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'
 

Комментарии:

1. Это помогает, я пытаюсь обновить информацию о местоположении, широте, адресе, состоянии батареи из API 2 с той же информацией из API 1, сопоставив их по серийному номеру