简述
新手小白,由于要向别人的服务器发送Post请求而自己这边没有服务器,所以自己就简单的搭建了一个小型的服务器做测试。
Create New Project
打开IntelliJ IDEA后选择Create New Project新建一个工程,然后在打开窗口中选择Spring Initializr,因为我这Java版本是1.8的,所以在点击Next后的窗口中,JavaVersion选择了8,至于其他的就按照自己意思来填写了,值得注意的是Artifact这里需要全部小写。
在打开 的窗口中左边的Dependencies找到Web项,需要选择 Spring Web,然后就直接Next了,最后修改下工程保存的路径,点击Finish结束工程创建。
配置Maven
网上下载apache-maven-3.6.1-bin.zip(文章后面有下载链接,当然也可以是其他的版本),这个maven配置包是必须的,解压后放到一个指定的目录下,我这里放到了D:\XXXX\IDEA\Maven下。
依次打开File->Settings,然后直接搜索Maven。Maven home directory:表示刚才解压的包所在目录,User settings file:表示解压的包里面的一个settings.xml所在目录,最后一个Local repository:是自己建立的一个目录,这个目录是以后所有包自动下载后存放的位置,这些东西都是一次性配置好就行。
Http
在src->main->java->com.example.httpserver下,右键弹出菜单New->Package建立一个包Controller,然后再Controller里添加一个Java Class,也是右键弹出菜单New->Java Class,类名自己随意就好。
以下就是Http服务器接收Post请求后的处理操作,请注意Post请求头是带有Authorization信息的,里边包含了用户名跟密码 Base64(userName:password),其中用户名跟密码是可以有Base64加密的,所以在接收到Post请求后需要解码Base64(已注释),实际上我是需要Base64加密解密的但是这里做测试就不带上了,值得注意一下@RequestMapping是相当于这个类接口的起始地址,而每个接口前面的@PostMapping相当于每个函数的接口起始地址,所以如果类前面有@RequestMapping的话那就表明你们村就在那看你想去访问哪一户人家了:
package com.example.httpserver.Controller;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
@RequestMapping("/deviceApi")
public class ProductInfoController {
@ResponseBody
@PostMapping(value = "/invokeSrv",produces = "application/json;charset=UTF-8")
public JSONObject recvProductInfo(@RequestBody BodyInfo body,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
// 设置编码格式
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 获取Authorization 验证信息如下
System.out.println("获取Authorization 验证信息如下: ");
System.out.println("Authorization: " + request.getHeader("Authorization"));
// 根据空格" " 分割字符串"Basic userName:userPass"
String[] auth = request.getHeader("Authorization").split(" ");
if (auth.length < 2){
return printWriter(body, "NG", "获取认证信息错误");
}
// 解密账号和密码
String userinfo = auth[1];
// try {
// BASE64Decoder decoder = new BASE64Decoder();
// userinfo = new String(decoder.decodeBuffer(auth[1]), "UTF-8");
// } catch (Exception e) {
// e.printStackTrace();
// return printWriter(body, "NG", "解密失败");
// }
// 根据冒号":" 分割字符串"userName:userPass"
String[] up = userinfo.split(":");
if (up.length < 2) {
return printWriter(body, "NG", "用户名或密码为空");
}
// 获取账号密码后做授权验证
String user = up[0], password = up[1];
System.out.println("user: " + user + " passwrod: " + password);
if (!"root".equals(user) || !"123456".equals(password)) {
return printWriter(body, "NG", "用户名或密码错误");
}
// 如果验证信息没有错误,返回给客户端信息
return printWriter(body, "OK", "验证成功");
}
public JSONObject printWriter(BodyInfo body, String result, String message) {
JSONObject json = new JSONObject(true);
json.put("reqCode", body.reqCode);
json.put("result", result);
json.put("message", message);
json.put("extend1", body.extend1);
json.put("extend2", body.extend2);
json.put("extend3", body.extend3);
System.out.println(message);
return json;
}
}
这里用到了 BodyInfo类作为接收参数,也是直接在包Controller下创建一个类叫BodyInfo:
package com.example.httpserver.Controller;
import lombok.Data;
@Data
public class BodyInfo {
public String reqCode;
public String reqTime;
public String clientCode;
public String tokenCode;
public String interfaceName;
public String deviceCode;
public String workTime;
public String status;
public String sn;
public String extend1;
public String extend2;
public String extend3;
public String extend4;
public String extend5;
public String extend6;
public String extend7;
public String extend8;
public String extend9;
public String extend10;
public Object[] detailList01;
}
因为使用到了Json,所以是需要添加依赖的,在pom.xml文件中<dependencies>xxx</dependencies>添加以下内容:
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
Postman
使用Postman测试一下,其中http://localhost:8080/deviceApi/invokeSrv,localhost:8080表示你本机的IP与服务器默认端口号,/deviceApi表示这个类的起始地址,/invokeSrv表示类函数的起始地址:
可以看到Post请求后,程序已经跳到了断点位置,显示并且打印了用户名跟密码。
需要工具的可以自行下载:https://pan.baidu.com/s/1iGMZrEAjBOUM9RoNgRTFLg 提取码:6DC1