【问题标题】:Formatting Json for Python LocustIO为 Python LocustIO 格式化 Json
【发布时间】:2018-04-17 13:59:27
【问题描述】:

为什么我收到这个帖子调用的错误请求?它与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)

【问题讨论】:

    标签: python json python-3.x locust


    【解决方案1】:

    json.dumps 将 json 对象(列表和字典)作为输入并将其序列化,并提供一个字符串作为输出。你用nameInquiry 喂它,它本身已经是一个字符串,因此是错误的。

    此外,post 获取字典作为输入,因此无需序列化它。简单的解决方案是将nameInquiry 设置为json 对象(请注意下面缺少的""")并将其直接提供给post。

    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",...
    """)
    

    【讨论】:

    • 谢谢。拯救了我的一天。
    • 我也遇到了同样的问题,我用了上面的方法但是还是遇到了同样的问题。
    【解决方案2】:

    有两种使用 Locust POST JSON 数据的一般方法。我更喜欢将字典传递给 self.client.post using the json keyword argument 因为我不必担心创建有效的 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 字符串,然后使用 data 参数将字符串传递给 self.client.post

    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 关键字参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多