Rails отправляет четыре обратной косой черты, используя Net::HTTP

Моему приложению 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\\\\"}'

Похоже, рельсы добавляют один из них, но даже если я удалю его и заменю следующим кодом:

a.gsub!(/\"/, '\'')

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

Есть идеи??


person guyaloni    schedule 31.12.2014    source источник


Ответы (1)


Используя set_form_data net/http, вы отправляете форму как urlencoded. Он НЕ публикует ваше тело запроса как чистый JSON.

Если вы хотите отправить необработанный 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
person Cody Caughlan    schedule 31.12.2014
comment
Большое спасибо! Одна вещь для тех, кто находит это полезным - чтобы получить json в приложении php, вы должны получить его из тела, используя: $body = file_get_contents('php://input'); - person guyaloni; 02.01.2015