For an assignment I have to create a program that uses rest. This is the code I was given by the teacher to get us started for this assignment, so this code below should be right.
import java.io.*;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.concurrent.Executors;
import com.sun.net.httpserver.*;
public class HttpServerDemo {
public static void main(String[] args) throws IOException {
InetSocketAddress addr = new InetSocketAddress(8080);
HttpServer server = HttpServer.create(addr, 0);
server.createContext( "/", new RootHandler());
server.createContext( "/foo/", new FooHandler());
server.setExecutor( Executors.newCachedThreadPool());
server.start();
System.out.println("Server is listening on port 8080" );
}
public static void printHeaders( HttpExchange exchange, PrintStream response) {
Headers requestHeaders = exchange.getRequestHeaders();
Set<String> keySet = requestHeaders.keySet();
Iterator<String> iter = keySet.iterator();
while( iter.hasNext()) {
String key = iter.next();
response.println( key + " = " + requestHeaders.get(key));
}
}
public static void printBody( HttpExchange exchange, PrintStream response) throws IOException {
BufferedReader body = new BufferedReader( new InputStreamReader( exchange.getRequestBody()));
String bodyLine;
while( (bodyLine = body.readLine()) != null) {
response.println( bodyLine);
}
}
}
class RootHandler implements HttpHandler {
public void handle( HttpExchange exchange) throws IOException {
String requestMethod = exchange.getRequestMethod();
Headers responseHeaders = exchange.getResponseHeaders();
responseHeaders.set( "Content-Type", "text/plain");
exchange.sendResponseHeaders( 200, 0);
PrintStream response = new PrintStream( exchange.getResponseBody());
response.println( "context: ROOT; method: " + requestMethod);
response.println( "--- headers ---");
HttpServerDemo.printHeaders( exchange, response);
if( requestMethod.equalsIgnoreCase( "POST")) {
response.println( "=== body ===");
HttpServerDemo.printBody( exchange, response);
}
response.close();
}
}
class FooHandler implements HttpHandler {
public void handle( HttpExchange exchange) throws IOException {
String requestMethod = exchange.getRequestMethod();
Headers responseHeaders = exchange.getResponseHeaders();
responseHeaders.set( "Content-Type", "text/plain");
exchange.sendResponseHeaders( 200, 0);
PrintStream response = new PrintStream( exchange.getResponseBody());
response.println( "context: FOO; method: " + requestMethod);
HttpServerDemo.printHeaders( exchange, response);
response.close();
}
}
Since the RootHandler class has an if statement checking for "POST" I will use that to test it. So when I use curl from a separate terminal to communicate with this program I enter:
curl –d "message=helloworld" http://localhost:8080/
and I get this in return:
curl: (6) Could not resolve host: –d; nodename nor servname provided, or not known
curl: (6) Could not resolve host: message=helloworld; nodename nor servname provided, or not known
context: ROOT; method: GET
--- headers ---
Host = [localhost:8080]
User-agent = [curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5]
Accept = [*/*]
I feel like I am making my mistake when I am using curl from my terminal. By looking at the errors it isnt taking the "-d" option I am giving it and it is causing the program to read the request method as "GET" instead of "POST". Ive tried this for "DELETE" and "PUT" request methods and got the same result.