Java自带的Http Server实现设置返回值的类型(content-type)

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Java自带的Http Server实现设置返回值的类型(content-type)

小楼夜听雨QAQ   2022-11-19 我要评论

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&param2=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);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们