Как пропарсить http запрос на ruby сервере?
Я делаю ajax запрос на свой сервер. Получить запрос я могу, ответ с сервера также приходит. Но я не могу получить данные, которые я передаю по запросу. Как мне реализовать чтение данных? Мой запрос
$.ajax({
url: 'http://127.0.0.1:5678/',
type: 'POST',
dataType: 'json',
data:JSON.stringify({"cmd":"register","player":{"login":login,"pass":"","temp":1}})
})
Серверная часть
while session = server.accept
request = session.gets
puts request.data
# 1
method, full_path = request.split(' ')
# 2
path, query = full_path.split('?')
puts query
puts path
puts method
session.print "HTTP/1.1 200\r\n" # 1
session.print "Content-Type: text/html\r\n" # 2
session.print "Access-Control-Allow-Origin: *\r\n" # 3
session.print "\r\n" # 3
session.print "Hello world! The time is #{Time.now}" #4
session.close
end
Ответы (1 шт):
Вы пытаетесь передать данные по HTTP, а принять через TCP-сокет, но при этом запрашиваете request.body которого на уровне сокетов не существует, потому что это опция HTTP. Вам нужно определиться:
- Хотите гонять байты по сокетам, тогда и передавайте их в сокет.
- Хотите получать AJAX-запрос, тогда вам нужно принимать данные через HTTP.
Если вы пробуете урок вроде этого, тогда вам нужно дополнительно реализовывать парсинг данных из сокета и в конечном итоге вы напишите свой HTTP, что довольно бессмысленно, потому что есть с десяток готовых библиотек.
Как это обычно делают:
Сначала ставите sinatra: gem install sinatra, затем создаете файл server.rb, вставляете в него код:
require 'sinatra'
require 'json'
post '/' do
pp params
"OK"
end
get '/' do
erb :client
end
Затем создаете HTML-страничку views/client.html со следующим содержимым:
<html>
<head>
<title>Client</title>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
</head>
<body>
<button id="ajax" type="button">Send AJAX-request</button>
<script>
var data = {
cmd:'register',
player:{
login:'login',
pass: '',
temp:1
}
};
var button = document.body.querySelector('#ajax');
button.addEventListener('click', function(e){
$.ajax({
url: 'http://127.0.0.1:4567/',
method: 'POST',
dataType: 'json',
data: data
})
});
</script>
</body>
</html>
Запускаете ruby server.rb, заходите браузером на http://127.0.0.1:4567/ и нажимаете кнопку. В консоли будет выведено что-то вроде этого:
::1 - - [18/Sep/2020:05:18:23 +0300] "GET / HTTP/1.1" 200 645 0.0101
{"cmd"=>"register", "player"=>{"login"=>"login", "pass"=>"", "temp"=>"1"}}