я пытаюсь записать самое простое приложение для сервера в Java, отображая форму HTML с входом текстовой области, который после представления дает мне возможность проанализировать xml, введенный в той текстовой области. На данный момент я создаю базирующийся сервер простого serversocket как этот:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class WebServer {
protected void start() {
ServerSocket s;
String gets = "";
System.out.println("Start on port 80");
try {
// create the main server socket
s = new ServerSocket(80);
} catch (Exception e) {
System.out.println("Error: " + e);
return;
}
System.out.println("Waiting for connection");
for (;;) {
try {
// wait for a connection
Socket remote = s.accept();
// remote is now the connected socket
System.out.println("Connection, sending data.");
BufferedReader in = new BufferedReader(new InputStreamReader(
remote.getInputStream()));
PrintWriter out = new PrintWriter(remote.getOutputStream());
String str = ".";
while (!str.equals("")) {
str = in.readLine();
if (str.contains("GET")){
gets = str;
break;
}
}
out.println("HTTP/1.0 200 OK");
out.println("Content-Type: text/html");
out.println("");
// Send the HTML page
String method = "get";
out.print("<html><form method="+method+">");
out.print("<textarea name=we></textarea></br>");
out.print("<input type=text name=a><input type=submit></form></html>");
out.println(gets);
out.flush();
remote.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
public static void main(String args[]) {
WebServer ws = new WebServer();
ws.start();
}
}
После того, как форма (текстовая область с xml и одним дополнительным вводом текста) отправлена в, 'получает' переменную Строкового типа, у меня есть значения Urlencoded моих переменных (также отображенный на экране, похоже что:
gets = GET /?we=%3Cnetwork+ip_addr%3D%2210.0.0.0%2F8%22+save_ip%3D%22true%22%3E%0D%0A%3Csubnet+interf_used%3D%22200%22+name%3D%22lan1%22+%2F%3E%0D%0A%3Csubnet+interf_used%3D%22254%22+name%3D%22lan2%22+%2F%3E%0D%0A%3C%2Fnetwork%3E&a=fooBar HTTP/1.1
Что может я делать для изменения, ДОБИРАЮТСЯ до метода POST (если я просто изменяю его в форме и, чем помещенный, "если (str.contains ("POST")) {" он дает мне строку как
gets = POST / HTTP/1.1
без переменных. И после этого, как я могу использовать xml от своего поля текстовой области (позвонил 'нам')?
Типичный запрос HTTP POST выглядит следующим образом:
POST / HTTP/1.1
Host: www.example.com
Accept: text/html,*/*;q=0.5
User-Agent: BrowserName/1.0
Referer: http://www.example.com/
Content-type: application/x-www-form-urlencoded; charset=utf-8
foo=1&bar=2
Первая строка содержит метод (обычно GET или POST, но есть и другие, например HEAD, PUT, DELETE), URI запроса и версию протокола. Затем есть ряд заголовков запросов, которые могут быть не так важны для простого сервера. Если метод принимает тело запроса (POST и PUT), то после заголовков идет пустая строка, за которой следует тело запроса. В случае POST из HTML-формы тело будет состоять из пар ключ = значение
для всех элементов формы, соединенных парами и
. Значения будут закодированы в%.
Вам просто нужно правильно проанализировать весь запрос.
Вы должны знать, что окончания строк в HTTP должны быть в стиле Windows ( \ r \ n
). Метод readline ()
может интерпретировать это как два разрыва строки, поэтому может показаться, что между каждой реальной строкой есть пустая строка.
Данные POST не находятся в первой строке. Распечатайте все строки, и вы увидите. На самом деле это сразу после пустой строки.