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 "";
}
}

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 + "]";
}
}

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();
}
} }

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

Java调用Http/Https接口(1)--编写服务端的更多相关文章

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

    WebClient是Spring提供的非阻塞.响应式的Http客户端,提供同步及异步的API,将会代替RestTemplate及AsyncRestTemplate.文中所使用到的软件版本:Java 1 ...

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

    RestTemplate是Spring提供的用于访问Http接口的客户端,提供同步的API:在将来的Spring版本中可能会过时,将逐渐被WebClient替代.文中所使用到的软件版本:Java 1. ...

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

    HttpAsyncClient是HttpClient的异步版本,提供异步调用的api.文中所使用到的软件版本:Java 1.8.0_191.HttpClient 4.1.4. 1.服务端 参见Java ...

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

    HttpClient是Apache HttpComponents项目下的一个组件,是Commons-HttpClient的升级版,两者api调用写法也很类似.文中所使用到的软件版本:Java 1.8. ...

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

    Commons-HttpClient原来是Apache Commons项目下的一个组件,现已被HttpComponents项目下的HttpClient组件所取代:作为调用Http接口的一种选择,本文介 ...

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

    HttpURLConnection是JDK自身提供的网络类,不需要引入额外的jar包.文中所使用到的软件版本:Java 1.8.0_191. 1.服务端 参见Java调用Http接口(1)--编写服务 ...

  7. Java调用第三方http接口的方式

    1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...

  8. Java实现UDP之Echo客户端和服务端

    Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  9. Java实现TCP之Echo客户端和服务端

    Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

随机推荐

  1. Python3之logging模块浅析

    Python3之logging模块浅析   目录 Python3之logging模块浅析 简单用法 日志与控制台同时输出 一个同时输出到屏幕.文件的完成例子 日志文件截取 日志重复打印问题解决 问题分 ...

  2. Redis系列 | Redis5.0 新特性

  3. 轻量级Web服务器http-server

    http-server是一个简单的零配置命令行http服务器.可用于h5页面手机端测试 Vue .Angualr.React项目打包后真机测试 github地址:https://github.com/ ...

  4. 【linux基础】ubuntu16.04 安装后,屏幕分辨率过低且不可调节

    前言 安装CUDA和NVIDIA驱动之后,屏幕分辨率过低且不可调节,尝试了几种方法都没成功解决,特此讲解决方法记录下来. 解决过程 注销进入登录界面,按ctrl+alt+F1进入命令行终端,输入账户名 ...

  5. [LeetCode] 216. Combination Sum III 组合之和 III

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  6. [LeetCode] 278. First Bad Version 第一个坏版本

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  7. [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...

  8. 主机可以ping通虚拟机,虚拟机ping不通主机和外网

    vmware-->编辑-->虚拟网络编辑器-->更改配置,如下图选择:

  9. vue-cli3 中console.log报错

    Module Warning (from ./node_modules/eslint-loader/index.js):error: Unexpected console statement (no- ...

  10. Theano入门

    由于自己的一个小项目需要Theano部分的开源代码,所以学习一下并记录入门的经典网站. 入门中文博客:https://blog.csdn.net/hjimce/article/details/4680 ...