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接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM