Мне нужно выполнить запрос 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 выглядит идентично.