在 Java HttpServer 响应中设置内容类型
Setting Content Type in Java HttpServer response
我有一个 java echo httpserver up。
它适用于测试站点,但我正在使用的客户端代码无法获取数据。
服务器与 https://www.hurl.it/
完美配合
客户端与https://requestb.in/ and http://httpbin.org/post
完美配合
将两者结合使用时,我收到状态代码为 200 的响应,但没有元数据/body 内容显示在客户端中,即使它正在发送。
我唯一的猜测是因为没有包括内容类型,客户可能对此很挑剔。
如何在我的回复中指定内容类型?
(请注意,客户端使用 POST 作为参数以及一些 header 信息向服务器发送单个字符串。此代码当前仅设置为 return body content/parameter.)
任何想法表示赞赏!
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();
}
}
尝试添加
t.getResponseHeaders().put("Content-Type", "text/html");
写之前
自回答以来界面似乎已更改。在 Java 11 你需要:
t.getRequestHeaders().put("Content-Type", Collections.singletonList("text/html"));
我有一个 java echo httpserver up。
它适用于测试站点,但我正在使用的客户端代码无法获取数据。
服务器与 https://www.hurl.it/
完美配合客户端与https://requestb.in/ and http://httpbin.org/post
完美配合将两者结合使用时,我收到状态代码为 200 的响应,但没有元数据/body 内容显示在客户端中,即使它正在发送。
我唯一的猜测是因为没有包括内容类型,客户可能对此很挑剔。
如何在我的回复中指定内容类型?
(请注意,客户端使用 POST 作为参数以及一些 header 信息向服务器发送单个字符串。此代码当前仅设置为 return body content/parameter.)
任何想法表示赞赏!
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();
}
}
尝试添加
t.getResponseHeaders().put("Content-Type", "text/html");
写之前
自回答以来界面似乎已更改。在 Java 11 你需要:
t.getRequestHeaders().put("Content-Type", Collections.singletonList("text/html"));