#json #python-3.x #api
#json #python-3.x #API
Вопрос:
Мой код преобразует файл Excel в файл JSON, а затем файл JSON попадает в API для создания запросов в моем приложении.
Мой вывод JSON выглядит следующим образом:
{
"data": [
{
"requestedStart": "2018-11-16",
"requestedComplete": "2018-11-18",
"location": "Test",
"equipment": "Test",
"switchID": 1
},
{
"requestedStart": "2018-11-23",
"requestedComplete": "2018-11-25",
"location": "Test",
"equipment": "Test",
"switchID": 1
}
]
}
Мой код:
def json_from_excel():
excel_file = 'test.xlsx'
jsonfile = open('ExceltoJSON.json', 'w')
data = []
loaddata = OrderedDict()
workbook = xlrd.open_workbook(excel_file)
worksheet = workbook.sheet_by_name('testExceldata')
sheet = workbook.sheet_by_index(0)
for j in range(0, 6):
for i in range(1, 4):
temp = {}
temp["requestedStart"] = (sheet.cell_value(i, 0))
temp["requestedComplete"] = (sheet.cell_value(i, 1))
temp["location"] = (sheet.cell_value(i, 2))
temp["equipment"] = (sheet.cell_value(i, 3))
temp["switchID"] = (sheet.cell_value(i, 4))
data.append(temp)
loaddata['data'] = data
json.dump(loaddata, jsonfile, indent=3, sort_keys=False)
jsonfile.write('n')
return loaddata
if __name__ == '__main__':
data = json_from_excel()
AUTH_HEADERS = {
'Token': '5ab15b5a66',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
s = requests.session()
s.headers = AUTH_HEADERS
data = json.dumps(dict(data))
print (data)
url = 'https://myurl/external/api/v1/Request'
result = s.post(url, data=data, verify=False)
print(result.text)
s.close()
Но мой API может принимать только один объект одновременно. Итак, я хочу создать цикл таким образом, чтобы программа принимала первый объект, т.Е.
{
"requestedStart": "2018-11-16",
"requestedComplete": "2018-11-18",
"location": "Test",
"equipment": "Test",
"switchID": 1
}
и нажмите API, чтобы создать запрос, и вернитесь, чтобы взять второй объект и перейти к API, и так далее.
Как мне создать такой цикл?
Ответ №1:
Вы можете просто легко выполнить итерацию по тому массиву данных, который у вас есть:
# data = json.dumps(dict(data)) -- this is not needed
url = 'https://myurl/external/api/v1/Request'
for post_data in data['data']:
result = s.post(url, json=post_data, verify=False)
print(result.text)
s.close()
Когда вы используете session.post()
, он может вести себя по-разному, смотрите Документы.
data
является словарем: данные, закодированные в форме POST. Это используется с HTTP-формамиdata
является строкой: ПУБЛИКАЦИЯ с закодированными вами данными, заголовки должны быть установлены соответствующим образомjson
является словарем: POST с данными JSON сapplication/json
автоматически установленным
Это означает, что вы также можете data=json.dumps(data)
отправить его в виде JSON, но я предлагаю использовать json
параметр.
Комментарии:
1. Я пробовал это. Но выходные данные заключаются в одинарные кавычки. {‘requestedStart’: ‘2018-11-16T08:00:00Z’, ‘requestedComplete’: ‘2018-11-18T17:00:00Z’, ‘location’: ‘TAWAU’, ‘equipment’: ‘GT2’, ‘switchOrderTypeID’: 1} Из-за этого он не попадает в api. Мне это нужно в двойных кавычках.
2. он печатается в одинарных кавычках, потому что это интерпретация строк по умолчанию в python. Это не имеет никакого отношения к тому, как отправляется ваш запрос. Что именно содержится в вашем ответе?
3. Проблема здесь в строке data = json.dumps(dict(данные)) . Используя эту строку в исходном коде, я получаю данные в двойных кавычках, которые попадают в api. Но решение, о котором вы сказали (поскольку вы сказали удалить data=json.dumps), заключается в печати выходных данных в одинарных кавычках. Но если я использую строку data=json.dumps вместе с вашим решением, я получаю ошибку такого типа «Строковые индексы должны быть целыми числами».
4. Извините, по какой-то причине я предположил, что вам нужны значения в кодировке формы, но я соответствующим образом обновил свой ответ.
5. Спасибо, чувак. Это сработало идеально. Спасибо за ценное предложение 🙂