Форматирование Json для Python LocustIO

Почему я получаю плохой запрос на эту почту? Это связано с форматированием json. Как переформатировать объект json, переданный как параметр? Я провожу нагрузочный тест с использованием LocustIO и Python.

from locust import HttpLocust, TaskSet, task
from slumber import API 
import json, requests

nameInquiry = """
[{
  "data": {
    "Account Number": "1234567898",
    "Bank Code": "EBN",
    "AppId": "com.appzonegroup.zone",
    "deviceId": "a4a7427032c286e3",
    "Sender Phone Number": "+2348094399450",
    "Sender Conversation ID": "161503479186618e8726fc4-70c0-4768-a2ea-5217c3a3c26d",
    "FileId": ""
  },
  "instruction": {
    "FunctionId": "",
    "FlowId": "813dac4f-7e44-4873-b45f-f6f3b5dbe436",
    "InstitutionCode": "",
    "TimeOutSeconds": 30
  }
}]
"""
myheaders = {'Content-Type': 'application/json', 'Accept': 'application/json'}


class NameInquiries(TaskSet):
  @task(1)
  def send(self):
    response = self.client.post("/zoneflowsapi/api/Goto/goto/", data=json.dumps(nameInquiry), headers= myheaders )

    print("Response status code:", response.status_code)
    print("Response content:", response.text)
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
0
2 876
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

json.dumps принимает в качестве входных данных объект json (списки и словари) и сериализует его, выдавая строку в качестве вывода. Вы скармливаете ему nameInquiry, который сам по себе уже является строкой, поэтому возникает ошибка.

Кроме того, Почта получает словарь в качестве входных данных, поэтому нет необходимости его сериализовать. Простое решение - установить nameInquiry как объект json (обратите внимание на отсутствующий """ ниже) и передать его непосредственно для публикации.

nameInquiry = [{
    "data": {
    "Account Number": "1234567898",
    "Bank Code": "EBN",
    "AppId": "com.appzonegroup.zone",
    ...
}]

...

response = self.client.post("/zoneflowsapi/api/Goto/goto/", data=nameInquiry, headers=myheaders)

В противном случае вы можете сохранить строку и десериализовать ее с помощью json.loads:

nameInquiry = json.loads("""
[{
  "data": {
  "Account Number": "1234567898",...
""")

Спасибо. спас мой день.

ken4ward 17.04.2018 17:01

Я также столкнулся с той же проблемой, я использовал вышеуказанный метод, но все еще сталкиваюсь с той же проблемой.

Aziz Zoaib 22.09.2019 13:14

Есть два основных способа POST данных JSON с Locust. Я предпочитаю передавать словарь в self.client.postиспользуя аргумент ключевого слова json, потому что мне не нужно беспокоиться о создании действительного JSON:

nameInquiry = [{
  "data": {
    "Account Number": "1234567898",
    "Bank Code": "EBN",
    "AppId": "com.appzonegroup.zone",
    "deviceId": "a4a7427032c286e3",
    "Sender Phone Number": "+2348094399450",
    "Sender Conversation ID": "161503479186618e8726fc4-70c0-4768-a2ea-5217c3a3c26d",
    "FileId": ""
  },
  ...
}]

response = self.client.post("/zoneflowsapi/api/Goto/goto/", json=nameInquiry)

Другой подход - вручную создать допустимую строку JSON или использовать json.dumps(dict) для создания допустимой строки JSON и передать эту строку в self.client.post с помощью аргумента data:

nameInquiryString = """
[{
  "data": {
    "Account Number": "1234567898",
    "Bank Code": "EBN",
    "AppId": "com.appzonegroup.zone",
    "deviceId": "a4a7427032c286e3",
    "Sender Phone Number": "+2348094399450",
    "Sender Conversation ID": "161503479186618e8726fc4-70c0-4768-a2ea-5217c3a3c26d",
    "FileId": ""
  }
...
}]
"""    
response = self.client.post("/zoneflowsapi/api/Goto/goto/", data=nameInquiryString)

Если вы используете self.client.put, вы должны использовать второй подход, потому что метод put не поддерживает аргумент ключевого слова json.

Другие вопросы по теме