Как получить пост контент с Groovy прослушивания на порт? - PullRequest
3 голосов
/ 31 декабря 2010

Я написал следующий простой код, который обрабатывает запрос.

if (init)
  data = ""

if (line.size() > 0) {
  data += "--> " + line + "\n"
} else {
  println "HTTP/1.1 200 OK\n"
  println data
  println "----\n"
  return "success"
}

Затем я запускаю его, выполняя groovy -l 8888 ServerTest.groovy Однако, похоже, он не печатает никаких данных POST. Я проверяю это, выполняя curl -d "d=test" <a href="http://localhost:8888/" rel="nofollow">http://localhost:8888/</a> Кто-нибудь знает, как получить эти данные в Groovy?

1 Ответ

2 голосов
/ 02 января 2011

Чтобы опция прослушивания порта работала, вы должны также использовать опции -n или -p.

Пример:

// test.groovy
println "Got $line from socket"

$ groovy -n -l8888 test.groovy &
groovy is listening on port 8888
$ echo hello | nc localhost 8888
Got hello from socket
$

EDIT: Также обратите внимание, что вы получаете одну строку из сокета, а не полный HTTP-запрос. Так что в случае GET вы получите несколько строк для обработки каждого запроса, выглядя примерно так:

GET / HTTP/1.1
Host: localhost:8888
[a variable number of headers]

Весь запрос завершается пустой строкой. С POST это будет выглядеть примерно так:

POST / HTTP/1.1
Host: localhost:8888
[a variable number of headers]

d=test

Запрос такой же, за исключением того, что пустая строка, завершающая GET, представляет собой данные POST. К сожалению, данные POST не заканчиваются символом новой строки, и groovy использует ввод с буферизацией строки, так что он просто сидит и ждет новой строки.

Однако вы можете заставить его продолжить, закрыв конец гнезда. Попробуйте что-то вроде этого:

System.err.println(line) // log the incoming data to the console

if (line.size() == 0) {
    println "HTTP/1.1 200 OK\r\n\r\nhello"
    socket.shutdownOutput()
}

Затем groovy очистит буфер и завершит закрытие другого конца, и вы получите ваши данные POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...