Java自带的Http Server实现设置返回值的类型(content-type)
作者:小楼夜听雨QAQ
这篇文章主要介绍了Java自带的Http Server实现设置返回值的类型(content-type),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Http Server如何设置返回值的类型(content-type)
以返回Json格式的数据为例
首先我们要自己写一个请求的处理器,需要实现HttpHandler接口,并重写handle方法。

handle方法会获得一个HttpExchange,通过exchange可以设置返回值内容与长度
private void response(HttpExchange exchange, String jsonBody) {
try {
byte[] bytes = jsonBody.getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().add("Content-Type", "application/json; charset=utf-8");
exchange.sendResponseHeaders(200, bytes.length);
OutputStream outputStream = exchange.getResponseBody();
outputStream.write(jsonBody.getBytes(StandardCharsets.UTF_8));
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}注意两条语句的顺序:
设置请求头的语句一定要放在sendResponseHeaders前面!
sendResponse主要作用是发送响应头给客户端,发送后再设置响应头会被忽略掉。
也就是说响应头和响应体是分开发送的。这个可以通过debug验证,如下:
断点打在这里,用postman发起请求

postman显示发送状态

继续向下执行,设置请求头,依然是上述状态。
直到执行完sendResponseHeaders,postman虽然还在等待数据,但是响应头已经接收到了:

响应头

response body
执行到最后,发送完响应体后,截图如下:

最后结果
由此可见响应头与响应体是分开发送的。
获取http接口返回值
/**
*description:获取http接口返回值 有参数
* 返回值为 jsonarray 字符串形式
*@author: fuxb
*@date: 2021/7/28 11:00
@param path http 接口地址
@param post 参数 形式为 param1=value1¶m2=value2
*@return: com.google.gson.JsonObject
*/
public static String postDownloadJson(String path,String post){
URL url = null;
try {
url = new URL(path);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");// 提交模式
// conn.setConnectTimeout(10000);//连接超时 单位毫秒
// conn.setReadTimeout(2000);//读取超时 单位毫秒
// 发送POST请求必须设置如下两行
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
// 获取URLConnection对象对应的输出流 解决java.io.IOException: Server returned HTTP response code: 500 问题,使用OutputStreamWriter 转 utf-8格式,参数不能有空格的问题
// PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
OutputStreamWriter printWriter = new OutputStreamWriter(httpURLConnection.getOutputStream(), "utf-8");
// 发送请求参数
java.net.URLEncoder.encode(post, "UTF-8");
printWriter.write(post);//post的参数 xx=xx&yy=yy
// flush输出流的缓冲
printWriter.flush();
//开始获取数据
BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len;
byte[] arr = new byte[1024];
while((len=bis.read(arr))!= -1){
bos.write(arr,0,len);
bos.flush();
}
bos.close();
// return (JsonObject)parse.parse(bos.toString("utf-8"));
return bos.toString("utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}//返回的json数组字符串转list<bean>: List<ResKPID> listKpid = JSONObject.parseArray(listStrKpid, ResKPID.class);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
