Java: Simple HTTP Server application that responds in JSON

后端 未结 4 1362
一生所求
一生所求 2021-02-15 19:56

I want to create a very simple HTTP server application in Java.

For example, if I run the server on localhost in port 8080, and I make

4条回答
  •  不思量自难忘°
    2021-02-15 20:46

    You could use classes from the package com.sun.net.httpserver:

    import com.sun.net.httpserver.Headers;
    import com.sun.net.httpserver.HttpServer;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.InetSocketAddress;
    import java.net.URI;
    import java.net.URLDecoder;
    import java.nio.charset.Charset;
    import java.nio.charset.StandardCharsets;
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    
    public class JsonServer {
        private static final String HOSTNAME = "localhost";
        private static final int PORT = 8080;
        private static final int BACKLOG = 1;
    
        private static final String HEADER_ALLOW = "Allow";
        private static final String HEADER_CONTENT_TYPE = "Content-Type";
    
        private static final Charset CHARSET = StandardCharsets.UTF_8;
    
        private static final int STATUS_OK = 200;
        private static final int STATUS_METHOD_NOT_ALLOWED = 405;
    
        private static final int NO_RESPONSE_LENGTH = -1;
    
        private static final String METHOD_GET = "GET";
        private static final String METHOD_OPTIONS = "OPTIONS";
        private static final String ALLOWED_METHODS = METHOD_GET + "," + METHOD_OPTIONS;
    
        public static void main(final String... args) throws IOException {
            final HttpServer server = HttpServer.create(new InetSocketAddress(HOSTNAME, PORT), BACKLOG);
            server.createContext("/func1", he -> {
                try {
                    final Headers headers = he.getResponseHeaders();
                    final String requestMethod = he.getRequestMethod().toUpperCase();
                    switch (requestMethod) {
                        case METHOD_GET:
                            final Map> requestParameters = getRequestParameters(he.getRequestURI());
                            // do something with the request parameters
                            final String responseBody = "['hello world!']";
                            headers.set(HEADER_CONTENT_TYPE, String.format("application/json; charset=%s", CHARSET));
                            final byte[] rawResponseBody = responseBody.getBytes(CHARSET);
                            he.sendResponseHeaders(STATUS_OK, rawResponseBody.length);
                            he.getResponseBody().write(rawResponseBody);
                            break;
                        case METHOD_OPTIONS:
                            headers.set(HEADER_ALLOW, ALLOWED_METHODS);
                            he.sendResponseHeaders(STATUS_OK, NO_RESPONSE_LENGTH);
                            break;
                        default:
                            headers.set(HEADER_ALLOW, ALLOWED_METHODS);
                            he.sendResponseHeaders(STATUS_METHOD_NOT_ALLOWED, NO_RESPONSE_LENGTH);
                            break;
                    }
                } finally {
                    he.close();
                }
            });
            server.start();
        }
    
        private static Map> getRequestParameters(final URI requestUri) {
            final Map> requestParameters = new LinkedHashMap<>();
            final String requestQuery = requestUri.getRawQuery();
            if (requestQuery != null) {
                final String[] rawRequestParameters = requestQuery.split("[&;]", -1);
                for (final String rawRequestParameter : rawRequestParameters) {
                    final String[] requestParameter = rawRequestParameter.split("=", 2);
                    final String requestParameterName = decodeUrlComponent(requestParameter[0]);
                    requestParameters.putIfAbsent(requestParameterName, new ArrayList<>());
                    final String requestParameterValue = requestParameter.length > 1 ? decodeUrlComponent(requestParameter[1]) : null;
                    requestParameters.get(requestParameterName).add(requestParameterValue);
                }
            }
            return requestParameters;
        }
    
        private static String decodeUrlComponent(final String urlComponent) {
            try {
                return URLDecoder.decode(urlComponent, CHARSET.name());
            } catch (final UnsupportedEncodingException ex) {
                throw new InternalError(ex);
            }
        }
    }
    

提交回复
热议问题