在Java HttpServer响应

时间:2016-07-31 00:19:23

标签: java server outputstream httpserver

我有一个java echo httpserver。

它适用于测试站点,但我正在使用的客户端代码无法获取数据。

服务器与https://www.hurl.it/

完美配合

客户端与https://requestb.in/http://httpbin.org/post

完美配合

当合并两者时,我得到一个状态代码为200的响应,但是即使它被发送,客户端也不会显示元数据/正文内容。

我唯一的猜测是因为内容类型不包括在内,客户可能会对此感到挑剔。

如何在响应中指定内容类型?

(注意,客户端将一个字符串发送到服务器,并将POST作为参数以及一些标题信息。此代码当前设置为仅返回正文内容/参数。)

任何想法都赞赏!

import static java.net.HttpURLConnection.HTTP_OK;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
import java.util.List;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

/**
* Echo the body of an HTTP request back as the HTTP response. This is merely
* a simple exercise of the Secret Sun Web Server. As configured, the URL to
* access it is http://localhost:8000/echo.
* 
* @author Andrew Cowie
*/
public final class Test
{
public static void main(String[] args) throws IOException {
    final InetSocketAddress addr;
    final HttpServer server;

    addr = new InetSocketAddress(8000);

    server = HttpServer.create(addr, 10);
    server.createContext("/echo", new EchoHandler());
    server.start();
}
}

class EchoHandler implements HttpHandler
{
public void handle(HttpExchange t) throws IOException {
    final InputStream is;
    final OutputStream os;
    StringBuilder buf;
    int b;
    final String request, response;

    buf = new StringBuilder();

    /*
     * Get the request body and decode it. Regardless of what you are
     * actually doing, it is apparently considered correct form to consume
     * all the bytes from the InputStream. If you don't, closing the
     * OutputStream will cause that to occur
     */

    is = t.getRequestBody();

    while ((b = is.read()) != -1) {
        buf.append((char) b);
    }

    is.close();

    if (buf.length() > 0) {
        request = URLDecoder.decode(buf.toString(), "UTF-8");
    } else {
        request = null;
    }

    /*
     * Construct our response:
     */

    buf = new StringBuilder();
    //buf.append("<html><head><title>HTTP echo server</title></head><body>");
    //buf.append("<p><pre>");
    //buf.append(t.getRequestMethod() + " " + t.getRequestURI() + " " + t.getProtocol() + "\n");

    /*
     * Process the request headers. This is a bit involved due to the
     * complexity arising from the fact that headers can be repeated.
     */

    Headers headers = t.getRequestHeaders();

    for (String name : headers.keySet()) {
        List<String> values = headers.get(name);

        for (String value : values) {
            //buf.append(name + ": " + value + "\n");
        }
    }

    /*
     * If there was an actual body to the request, add it:
     */

    if (request != null) {
        //buf.append("\n");
        buf.append(request);
    }

    //buf.append("</pre></p>");
    //buf.append("</body></html>\n");

    response = buf.toString();
    System.out.println(response);

    /*
     * And now send the response. We could have instead done this
     * dynamically, using 0 as the response size (forcing chunked
     * encoding) and writing the bytes of the response directly to the
     * OutputStream, but building the String first allows us to know the
     * exact length so we can send a response with a known size. Better :)
     */

    t.sendResponseHeaders(HTTP_OK, response.length());

    os = t.getResponseBody();

    os.write(response.getBytes());

    /*
     * And we're done!
     */

    os.close();
    t.close();
}

}

2 个答案:

答案 0 :(得分:3)

尝试添加

t.getResponseHeaders().put("Content-Type", "text/html"); 

写作之前

答案 1 :(得分:0)

似乎自回答以来界面已更改。在 Java 11 中,您需要:

t.getRequestHeaders().put("Content-Type", Collections.singletonList("text/html"));