Почтальон POST работает правильно; Руби ПОСТ не делает. Как мне отладить разницу? - PullRequest
0 голосов
/ 29 мая 2019

Мне нужно выполнить запрос POST для API, который принимает полезную нагрузку JSON, которая содержит вложенный строковый объект JSON. Я делаю запрос GET, чтобы получить строку, анализирую ее (дважды!), Чтобы получить хеш, изменяю один параметр, затем отправляю его обратно. Когда я пишу через Почтальон, он проходит как обычно. Когда я отправляю ту же строку через гем Ruby Rest-Client, кажется, что POST проходит, но есть проблема с тем, как распределяется полезная нагрузка, обеспечивая нежелательный результат.

К сожалению, я не могу реорганизовать этот явно плохо спроектированный сервер. Я могу работать только с тем, что имею.

Я пробовал дюжину перестановок этого кода. Все, что идет в пост, выглядит правильно и идентично посту почтальона.

Вот почтальон HTTP-ified, лишенный идентифицирующей информации:

POST /example/home/api/savesettings HTTP/1.1
Host: dev.noneofyourbusiness.com
Cookie: identification-gui=f4k3-gu1-5tr1n9
Content-Type: application/json

{"settings":"{\"rows\":50,\"columns\":[\"Col1\",\"Col2\",\"Col3\",\"Col4\"],\"sort\":{\"column\":\"Col1\",\"direction\":1},\"filters\":{\"Status\":[\"Active\"]},\"widths\":{\"Id\":\"170px\",\"Description\":\"192px\"}}"}

Вот код Ruby, предназначенный для того же:

response = RestClient.get(
        get_url,
        :accept => :json,
        :cookies => {cookie[:name] => cookie[:value]}
    )

hash = JSON.parse(JSON.parse(response))
hash['columns'] = "Col1;Col2;Col3;Col4"
payload = {:settings => hash.to_json}.to_json

RestClient.post(
        post_url,
        payload,
        :content_type => :json,
        :cookies => {cookie[:name] => cookie[:value]}
    )

Запрос почтальона правильно устанавливает столбцы. Похоже, что запрос Ruby стирает все настройки, что наводит меня на мысль, что JSON отформатирован неправильно, но я не уверен.

При отладке полезная нагрузка тела почтальона / Rest-Client выглядит идентично.

1 Ответ

1 голос
/ 29 мая 2019

После недели, когда я ударился головой о стол, я понял, что все, что мне нужно сделать, это добавить

.split(";")

до конца моих столбцов. Теперь все работает.

...