Моему приложению rails необходимо отправить некоторые данные в приложение php, которое ожидает вызов POST.
Я использую следующий код:
uri = URI.parse(apiUrl)
req = Net::HTTP::Post.new(uri.to_s, initheader = {'Content-Type' =>'application/json'})
req.basic_auth(api_key, token)
req.set_form_data({"action" => action, "data" => data})
http = Net::HTTP.new(uri.host, uri.port)
response = http.request(req)
Где данные — это хеш, преобразованный в json:
data = {
:key1 => val1,
:key2 => val2
}.to_json
(это вложенный хеш, т.е. некоторые значения также являются хешами)
Моя проблема заключается в том, что приложение php получает 4 обратной косой черты перед каждой кавычкой:
$data_json = $_POST['data'];
error_log($data_json);
и в журнале ошибок я вижу:
'{\\\\"key1\\\\":val1,\\\\"key2\\\\":\\\\"val2\\\\"}'
Похоже, что rails добавить один из них, но даже если я удаляю его и заменяю его следующим кодом:
a.gsub!(/\"/, '\'')
Я до сих пор получаю много обратной косой черты внутри приложения php, следовательно не может преобразовать строку в массив.
Любая идея??
Используя set_form_data
net / http отправляет форму как urlencoded. Это НЕ публикует ваше тело запроса как чистый JSON.
Если вы хотите POST raw JSON, вам нужно будет следовать такой схеме:
uri = URI('https://myapp.com/api/v1/resource')
req = Net::HTTP::Post.new(uri, initheader = {'Content-Type' =>'application/json'})
req.body = {param1: 'some value', param2: 'some other value'}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(req)
end
Других решений пока нет …