• Java调用Http/Https接口(1)--编写服务端


      Http接口输入的数据一般是键值对或json数据,返回的一般是json数据。本系列文章主要介绍Java调用Http接口的各种方法,本文主要介绍服务端的编写,方便后续文章里的客户端的调用。文中所使用到的软件版本:Java 1.8.0_191、SpringBoot 2.2.1.RELEASE。

    1、服务端Controller

    package com.inspur.demo.http.server;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    
    import com.inspur.demo.common.entity.CallResult;
    import com.inspur.demo.common.util.FileUtil;
    import com.inspur.demo.http.entity.User;
    
    @Controller
    @RequestMapping(value="/httptest/", method = {RequestMethod.GET, RequestMethod.POST})
    public class HttpTestController {
        private static Logger logger = LoggerFactory.getLogger(HttpTestController.class);
        
        @RequestMapping(value = "getUser", produces = "application/json;charset=UTF-8")
        @ResponseBody
        public CallResult<User> getUser(String userId, String userName) {
            logger.info("userId={},userName={}", userId, userName);
            User user = new User();
            user.setUserId(userId);
            user.setUserName(userName);
            CallResult<User> result = new CallResult<User>(0, "OK", user);
            return result;
        }
        
        /**
         * 传入json
         * @param user
         * @return
         */
        @RequestMapping("addUser")
        @ResponseBody
        public CallResult<User> addUser(@RequestBody User user) {
            logger.info(user.toString());
            CallResult<User> result = new CallResult<User>(0, "OK", user);
            return result;
        }
        
        /**
         * 上传文件
         * 这种方式不适合页面form表单上传文件,适合客户端调用
         * @param request
         * @return
         */
        @RequestMapping(value = "upload", produces = "application/json;charset=UTF-8")
        @ResponseBody
        public CallResult<String> upload(HttpServletRequest request) {
            InputStream in = null;
            OutputStream out = null;
            CallResult<String> result = new CallResult<String>(0, "OK", "上传成功");
            try {
                in = new BufferedInputStream(request.getInputStream(), 16 * 1024);
                //假设上传的就是jpg文件
                String fileName = "d:/temp/upload_" + System.currentTimeMillis() + ".jpg";
                out = new BufferedOutputStream(new FileOutputStream(fileName), 16 * 1024);
                byte[] buffer = new byte[16 * 1024];
                int len = 0;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
            } catch (Exception e) {
                result = new CallResult<String>(-1, "发生异常", "");
                e.printStackTrace();
            } finally {
                FileUtil.close(in);
                FileUtil.close(out);
            }
            logger.info("upload返回结果:{}", result);
            return result;
        }
        
        /**
         * 上传文件及发送键值对数据
         * @param file
         * @param param1
         * @param param2
         * @return
         */
        @RequestMapping("multi")
        @ResponseBody
        public CallResult<String> multi(@RequestParam("file") MultipartFile file, String param1, String param2) {
            logger.info("file={},param1={},param2={}", file.getOriginalFilename(), param1, param2);
            InputStream in = null;
            OutputStream out = null;
            CallResult<String> result = new CallResult<String>(0, "OK", "上传成功");
            try {
                in = new BufferedInputStream(file.getInputStream(), 16 * 1024);
                String originalFilename = file.getOriginalFilename();
                //ie上传文件该值是全路径,处理下
                if (originalFilename.indexOf("\") > -1) {
                    originalFilename = originalFilename.substring(originalFilename.indexOf("\") + 1);
                }
                String fileName = "d:/temp/multi_" + System.currentTimeMillis() + "_" + originalFilename;
                out = new BufferedOutputStream(new FileOutputStream(fileName), 16 * 1024);
                byte[] buffer = new byte[16 * 1024];
                int len = 0;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
            } catch (Exception e) {
                result = new CallResult<String>(-1, "发生异常", "");
                e.printStackTrace();
            } finally {
                FileUtil.close(in);
                FileUtil.close(out);
            }
            logger.info("multi返回结果:{}", result);
            return result;
        }
        
        /**
         * 下载文件
         * @param request
         * @param response
         */
        @RequestMapping("download")
        public void download(HttpServletRequest request, HttpServletResponse response) {
            int BUFFER_SIZE = 16 * 1024;
            BufferedInputStream bis = null;
            OutputStream out = null;
            try {
                String fileName = "a.jpg";
                String urlFileName = "";
                if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
                    urlFileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
                } else {
                    urlFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
                }
                
                response.reset();
                response.setContentType("application/octet-stream");
                response.setHeader("Content-Disposition", "attachment; filename="" + urlFileName + """);
                response.setHeader("Connection", "close");
                
                bis = new BufferedInputStream(new FileInputStream("d:/" + fileName), BUFFER_SIZE);
                out = new BufferedOutputStream(response.getOutputStream(), BUFFER_SIZE);
                byte buf[] = new byte[BUFFER_SIZE];
                int len;
                while ((len = bis.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                FileUtil.close(bis);
                FileUtil.close(out);
            }
        }
    }

    2、其他辅助类

    2.1、CallResult类

    package com.inspur.demo.common.entity;
    
    import java.io.Serializable;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    /**
     * @param <T>
     */
    public class CallResult<T> implements Serializable {
        private static final long serialVersionUID = 1L;
        
        /**
         * 返回码
         * 0 正常,其他异常
         */
        private int returnCode = 0;
        
        /**
         * 描述
         */
        private String description = "OK";
        
        /**
         * 结果数据
         */
        private T result;
        
        public CallResult(){}
        
        public CallResult(int returnCode, String description) {
            this.returnCode = returnCode;
            this.description = description;
        }
        
        public CallResult(int returnCode, String description, T result) {
            this.returnCode = returnCode;
            this.description = description;
            this.result = result;
        }
        
        public int getReturnCode() {
            return returnCode;
        }
        public void setReturnCode(int returnCode) {
            this.returnCode = returnCode;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        public T getResult() {
            return result;
        }
        public void setResult(T result) {
            this.result = result;
        }
        
        @Override
        public String toString() {
            //return JSON.toJSONString(this, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);
            try {
                return new ObjectMapper().writeValueAsString(this);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return "";
        }
    }
    View Code

    2.2、User类

    package com.inspur.demo.http.entity;
    
    public class User {
        private String userId;
        private String userName;
        
        public String getUserId() {
            return userId;
        }
        public void setUserId(String userId) {
            this.userId = userId;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        
        @Override
        public String toString() {
            return "User [userId=" + userId + ", userName=" + userName + "]";
        }
    }
    View Code

    2.2、FileUtil类

    package com.inspur.demo.common.util;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    
    /**
     * 文件操作工具
     */
    public class FileUtil {
        private FileUtil() {}
        
        public static void close(InputStream in) {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void close(OutputStream out) {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    View Code

    3、接口地址

    在本地部署后,访问地址为:

    http://localhost:8080/demo/httptest/getUser

    http://localhost:8080/demo/httptest/addUser

    http://localhost:8080/demo/httptest/upload

    http://localhost:8080/demo/httptest/multi

    http://localhost:8080/demo/httptest/download

    4、Https接口

    Https接口可以通过openssl生成证书、nginx设置方向代理来实现;由于这不是本系列文章的重点,这里就不详细介绍了,感兴趣的可以搜索研究。

    5、客户端

    本文主要是服务端的实现,客户端参见:

    Java调用Http/Https接口(2)--HttpURLConnection/HttpsURLConnection调用Http/Https接口

    Java调用Http/Https接口(3)--Commons-HttpClient调用Http/Https接口

    Java调用Http/Https接口(4)--HttpClient调用Http/Https接口

    Java调用Http/Https接口(5)--HttpAsyncClient调用Http/Https接口

    Java调用Http/Https接口(6)--RestTemplate调用Http/Https接口

    Java调用Http/Https接口(7,end)--WebClient调用Http/Https接口

  • 相关阅读:
    为富人服务,挣富人的钱 Leone
    javascript 高效数组随机顺序 Leone
    Atitit 开发2d游戏的技术选型attilax总结
    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结
    qqzoneQQ空间漏洞扫描器的设计attilax总结
    Atitit机器学习原理与概论book attilax总结
    Atiti  qq空间破解(3)gui图形化通用cli执行器atiuse
    Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15
    Atitit dsl对于数组的处理以及main函数的参数赋值
    Atitit 类库冲突解决方案  httpclient4.5.2.jar
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/11913419.html
Copyright © 2020-2023  润新知