使用 Python 请求 POST 数据到 REST API

Using Python Requests to POST data to REST API

我使用 FHIR REST API 有一段时间了,但对 Python 没有任何经验。作为我的第一个 python 项目,我正在尝试创建一个简单的 python 脚本,该脚本可以读取和写入打开的 API。我能够阅读,但由于以下原因,我一直坚持创建成功的 POST:错误 [TypeError("unhashable type: 'dict'")]。我不完全理解 python 字典的工作原理并尝试使用元组但得到相同的错误。

import requests #REST Access to FHIR Server
print('Search patient by MRN to find existing appointment')
MRN = input("Enter patient's MRN -try CT12181 :")
url = 'http://hapi.fhir.org/baseR4/Patient?identifier='+MRN
print('Searching for Patient by MRN...@'+url)

response = requests.get(url)
json_response = response.json()

try:
  key='entry'
  EntryArray=json_response[key]
  FirstEntry=EntryArray[0]
  key='resource'
  resource=FirstEntry['resource']
  id=resource['id']
  PatientServerId= id
  patientName = resource['name'][0]['given'][0] + ' ' +resource['name'][0]['family']
  print('Patient Found')
  print('Patient Id:'+id)
  
  #Searching for assertppointments
  
  url='http://hapi.fhir.org/baseR4/Appointment?patient='+id #fhir server endpoint

  #Print appointment data 

  print('Now Searching for Appointments...@'+url)
  appt_response = requests.get(url).json()
  key='entry'
  EntryArray=appt_response[key]
  print (f'Appointment(s) found for the patient {patientName}')
  for entry in EntryArray:
    appt=entry['resource']
 #   print('-------------------------')
 #   Date=appt['start']
 #   Status=appt['status'] 
 #   print(appt_response)
   #print ('AppointmentStartDate/Time: ' ,appt['start'])
    print ('Status: ' ,appt['status'])
    print ('ID: ' ,appt['id'])

    
  print('Search for open general practice slot?')
  option = input('Enter yes or no: ')
  while not(option == 'yes'):
      print('Please search a different paitent')
      option = input('Enter yes or no: ')    
  url = 'http://hapi.fhir.org/baseR4/Slot?service-type=57' #fhir server endpoint
  print('Searching for General Practice Slot...@'+url)
  slot_response = requests.get(url).json()
  key='entry'
  EntryArray=slot_response[key]
  print ('Slot(s) found for the service type General Practice')
  for entry in EntryArray:
    slot=entry['resource']
    #print('-------------------------')
    #slotDate=slot['start']
    #slotStatus=slot['status'] 
    print (f'SlotID: ' +slot['id'])
    #print (f'Status: ' +slot['status'])    
  print('Book a slot?')
  option = input('Enter yes or no: ')
  while not(option == 'yes'):
      print('Please search a different paitent')
      option = input('Enter yes or no: ')
#Book slot  
  slotID = input("Enter slot ID :")
  url = 'http://hapi.fhir.org/baseR4/Appointment' #fhir server endpoint
  print('Booking slot...@'+url)
  headers = {"Content-Type": "application/fhir+json;charset=utf-8"}
  data = {{"resourceType": "Appointment","status": "booked","slot": tuple({"reference":"Slot/104602"}),"participant": tuple({"actor": {"reference":"Patient/1229151","status": "accepted"}}),"reasonCode": tuple({"text": "I have a cramp"})}}
#fhir server json header content
#  headers = {"Content-Type": "application/fhir+json;charset=utf-8"}
  response = requests.post(url=url,headers=headers,data=data)
  print(response)
  print(response.json())
except Exception as e:
    print ('error' ,[e])
  
   

我期待 JSON 数据成功写入 API。我可以在 Postman 中使用相同的 JSON 数据来拨打电话,但我不太熟悉这在 Python.

中应该如何工作

看起来 Appointment POST endpoint 接受一个简单的负载,例如:

{
  "resourceType": "Appointment"
}

然后 returns 一个相应的 ID,根据 API 文档。

这与您在代码中试图将其他详细信息传递给此端点的尝试不同:

ata = {{"resourceType": "Appointment","status": "booked","slot": tuple({"reference":"Slot/104602"}),"participant": tuple({"actor": {"reference":"Patient/1229151","status": "accepted"}}),"reasonCode": tuple({"text": "I have a cramp"})}}

但是,要按照文档中的记录向端点发出 POST 请求,或许可以尝试 requests.postjson 参数。大致如下:

>>> import requests
>>> headers = {"Content-Type": "application/fhir+json;charset=utf-8"}
>>> json_payload = {
...   "resourceType": "Appointment"
... }
>>> url = 'http://hapi.fhir.org/baseR4/Appointment'
>>> r = requests.post(url, headers=headers, json=json_payload)
>>> r
<Response [201]>
>>> r.json()
{'resourceType': 'Appointment', 'id': '2261980', 'meta': {'versionId': '1', 'lastUpdated': '2022-03-25T23:40:42.621+00:00'}}
>>> 

如果您已经熟悉此 API,那么这可能会有所帮助。我怀疑您随后需要向另一个端点发送另一个 POST 或 PATCH 请求,使用您在第一个请求中返回的 ID 输入相关数据。