Серверная часть возвращает (ошибка типа: строковые индексы должны быть целыми числами)

#python #json #python-requests

Вопрос:

Я хочу отправить запрос на ОТДЫХ в конечную точку.

 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
 

Как я могу это исправить (либо на внутренней стороне, либо на стороне отправки запроса).

Комментарии:

1. По-видимому, request это строка, а не словарь

2. @ForceBru: Хм, так как же я мог передать его в качестве словаря в конечную точку?

3. В принципе, input_data может быть обычный словарь — requests справится со всем за вас.

4. @Fluxy, ха-ха, вы ошиблись в параметрах запроса

5. @toptalent: какой из них?

Ответ №1:

Для отправки json данных на сервер можно использовать json= параметр:

 import requests

param1 = "abc"
param2 = "def"

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

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

Комментарии:

1. Я попробовал то, что вы предложили, и все равно получил param1 = request['param1']nTypeError: string indices must be integers

2. @Fluxy payload Переменная должна быть обычным словарем python. requests отправит запрос Json на сервер.

3. Нет, извини, получаю это: parameters = json.loads(request)n File "/azureml-envs/azureml_xxxxx/lib/python3.6/json/__init__.py", line 354, in loadsn return _default_decoder.decode(s)n

4. @Fluxy Используйте resp = requests.post(scoring_uri, json=payload, headers=headers).json() для декодирования ответа Json (обратите внимание .json() в конце)

5. Я применил ваш код. Но я думаю, что проблема находится на внутренней стороне. Я добавил print запрос в бэкэнд, и вот что он печатает: request received: {"param2": "abc", "param2": "def"} . А потом там написано param1 = request['param1']nTypeError: string indices must be integers

Ответ №2:

Используйте этот код и получите ссылку отсюда

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

Затем

 param1 = request["param1"]
 

Комментарии:

1. Хотя в чем разница? Это то же самое, что и код OP

2. На стороне бэкенда это не работает, потому request что поступает в виде строки в бэкэнд. Я только что узнал об этом, работая print(type(request)) в бэкэнде. Поэтому я все еще получаю ту же ошибку. Должен ли я делать json.dumps(request) это в бэкэнде?