我的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应用程序中获得许多反斜杠,因此无法将字符串转换为数组。
任何想法??
答案 0 :(得分:1)
使用set_form_data
net / http将表单POST为urlencoded。它不会将您的请求正文发布为纯JSON。
如果你想POST原始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