【问题标题】:Backend returns <Response [502]> (TypeError: string indices must be integers)后端返回 <Response [502]> (TypeError:字符串索引必须是整数)
【发布时间】:2021-05-19 15:51:52
【问题描述】:

我想将 REST 请求发送到端点。

import requests

param1 = "abc"
param2 = "def"

input_data = """{{"param1": {}, "param2": {}}}""".format(param1, param2)

headers = {'Content-Type': 'application/json'}
resp = requests.post(scoring_uri, input_data, headers=headers)
resp

但是,我得到了错误响应:

<Response [502]>

日志:

param1 = request[\'param1\']\nTypeError: string indices must be integers

我该如何解决它(在后端或请求发送端)。

【问题讨论】:

  • 显然,request 是一个字符串,而不是字典
  • @ForceBru:嗯,那我怎么能把它作为字典传递给端点呢?
  • 基本上,input_data 可以是一个普通的字典——requests 会为你处理一切。
  • @Fluxy,哈哈,你的请求参数弄错了
  • @toptalent:哪一个?

标签: python json python-requests


【解决方案1】:

要将json数据发送到服务器,可以使用json=参数:

import requests

param1 = "abc"
param2 = "def"

payload = {"param1": param1, "param2": param2}

resp = requests.post(scoring_uri, json=payload, headers=headers)

【讨论】:

  • 我尝试了你的建议,仍然得到param1 = request[\'param1\']\nTypeError: string indices must be integers
  • @Fluxy payload 变量应该是普通的python字典。 requests 将向服务器发送 Json 请求。
  • 不,抱歉,收到了这个:parameters = json.loads(request)\n File "/azureml-envs/azureml_xxxxx/lib/python3.6/json/__init__.py", line 354, in loads\n return _default_decoder.decode(s)\n
  • @Fluxy 使用 resp = requests.post(scoring_uri, json=payload, headers=headers).json() 解码 Json 响应(注意末尾的 .json()
  • 我应用了你的代码。但我认为问题出在后端。我在后端添加了print 的请求,这就是它打印的内容:request received: {"param2": "abc", "param2": "def"}。然后它说param1 = request[\'param1\']\nTypeError: string indices must be integers
【解决方案2】:

使用此代码,并从here获取参考

input_data = {"param1": param1, "param2": param2}
resp = requests.post(scoring_uri, json=input_data, headers=headers)

然后

param1 = request["param1"]

【讨论】:

  • 有什么区别呢?这和OP的代码一样
  • 在后端,它不起作用,因为request 作为字符串到达​​后端。我刚刚通过在后端执行print(type(request)) 发现了它。因此我仍然遇到同样的错误。我应该在后端做json.dumps(request)吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2021-04-28
  • 2020-06-24
  • 2016-03-26
  • 2017-09-07
  • 2018-08-19
  • 2016-02-17
相关资源
最近更新 更多