Bedrosova
@Bedrosova
Приму стажера в команду (web, backend)

Как переписать этот код c PHP на Python?

Есть такой код:
$lead_data2 = [
        'fields' => [
            "NAME" => "Test",
            "TITLE" => "Test2",
            "PHONE" => [
                [
                    "VALUE" => "12345", 
                    "VALUE_TYPE" => "WORK" 
                ]
            ],

        ],
        'params' => ["REGISTER_SONET_EVENT" => "Y"]
    ];

print_r(http_build_query($lead_data2));

В результате выводит:
fields%5BNAME%5D=Test&fields%5BTITLE%5D=Test2&fields%5BPHONE%5D%5B0%5D%5BVALUE%5D=12345&fields%5BPHONE%5D%5B0%5D%5BVALUE_TYPE%5D=WORK&params%5BREGISTER_SONET_EVENT%5D=Y

Пытаюсь переписать его не питоне, уже как только ни ставила скобочки:
lead_data2 = {
            "fields" : [
                {"NAME" : "Test"},
                {"TITLE" : "Test2"},
                {"PHONE" : {
                    0:{
                    "VALUE" : "12345", 
                    "VALUE_TYPE" : "WORK" 
                    }
                }},

            ],
        'params' : {"REGISTER_SONET_EVENT" : "Y"}
        }
        
        print(urlencode(lead_data2))

В результате получается другая строка:
fields=%5B%7B%27NAME%27%3A+%27Test%27%7D%2C+%7B%27TITLE%27%3A+%27Test2%27%7D%2C+%7B%27PHONE%27%3A+%7B0%3A+%7B%27VALUE%27%3A+%2712345%27%2C+%27VALUE_TYPE%27%3A+%27WORK%27%7D%7D%7D%5D&params=%7B%27REGISTER_SONET_EVENT%27%3A+%27Y%27%7D
И там, куда я ее отправляю, я получаю ошибку:
Parameter 'fields' must be array

Помогите, опытные!
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
1.
lead_data2 = {
            "fields" : {
                "NAME" : "Test",
                "TITLE" : "Test2",
                "PHONE" : {'0' : {
                "VALUE" : "12345", 
                "VALUE_TYPE" : "WORK"
      }},
            },
        'params' : {"REGISTER_SONET_EVENT" : "Y"}
      }
                
print(http_build_query(lead_data2))

2.
def http_build_query(params, topkey = ''):
  from urllib.parse import quote
 
  if len(params) == 0:
    return ""
 
  result = ""
 
  # is a dictionary?
  if type (params) is dict:
    for key in params.keys():
      newkey = quote (key)
      if topkey != '':
        newkey = topkey + quote('[' + key + ']')
 
      if type(params[key]) is dict:
        result += http_build_query (params[key], newkey)
 
      elif type(params[key]) is list:
        i = 0
        for val in params[key]:
          result += newkey + quote('[' + str(i) + ']') + "=" + quote(str(val)) + "&"
          i = i + 1
 
      # boolean should have special treatment as well
      elif type(params[key]) is bool:
        result += newkey + "=" + quote (str(int(params[key]))) + "&"
 
      # assume string (integers and floats work well)
      else:
        result += newkey + "=" + quote (str(params[key])) + "&"
 
  # remove the last '&'
  if (result) and (topkey == '') and (result[-1] == '&'):
    result = result[:-1]
 
  return result
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Zarom
@Zarom
Мастер на все руки из жопы
С типами структур и правда не порядок. То что для php что хеш, что массив - всё одно, для питона две разных структуры. Хеш - это dict, а массив - list. Будет проще определиться если получить json из тех данных, которые сформировал php.
В питоне так же данные предварительно нужно преобразовать в json, прежде чем прогонять urlencode'ом. И т.к. прочего кода нет, я лишь могу предположить что нет в этом необходимости - request сам с формирует валидный запрос из dict/list
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы