趁着疫情横行,这几天就乖乖呆在家里做毕设,做的是一个昏天黑地;
讲真的,做一次毕业设计才知道自己学的有多烂。
毕设真的是对自己所学知识的一次梳理,消化,巩固的过程。同时也获得了课堂书本里学不到的经验,是一次深层次的积累。
言归正传;
先新建我的MyPostUtils工具类;
前人栽树,后人乘凉,此方法也是模仿别人学以致用
贴代码:
public class MyPostUtils {
public static String sendPost(String url,String param){
OutputStreamWriter out =null;
BufferedReader reader = null;
/*存储要返回的值*/
String response = "";
//创建连接
try {
URL httpUrl = null; //HTTP URL类 用这个类来创建连接
//创建URL
httpUrl = new URL(url);
//建立连接
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
//conn.setRequestProperty("connection", "keep-alive");
conn.setUseCaches(false);//设置不要缓存
conn.setInstanceFollowRedirects(true);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
//POST请求写给服务器数据
out = new OutputStreamWriter(conn.getOutputStream());
out.write(param);
out.flush();
//读取响应收到服务器传回的数据
reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String lines;
while ((lines = reader.readLine()) != null) {
lines = new String(lines.getBytes(), "utf-8");
response+=lines;
}
reader.close();
// 断开连接
conn.disconnect();
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(reader!=null){
reader.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return response;
}
}
怎么说呢:
post请求;有参有返:给一个url,给一个参数传给服务器,返回值是接收服务器的数据
- 只请求,不传不接收数据,调用只需要给个url;
- 请求且传送数据,不接收,调用给个url和参数;
- 请求发送且接收;给个url和参数后,还需要给个string=sendPost(),来接收数据;
1.无数据传输的请求
在安卓activity的onCreate()里面新建线程,调用post工具类;进行http请求;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_begin);
new Thread(new Runnable() {
@Override
public void run() {
/*与服务器建立第一次连接初始化容器*/
MyPostUtils.sendPost("http://192.168.43.53:8080/lz/map/begin", "");
}
}).start();
仔细看的话你会发现我的工具类中sendPost方法是两个参数的,为什么我的请求只有一个url呢?
因为我只进行请求,并不给服务器传递任何参数;
我的服务器部分代码是这样的;
@ResponseBody
@RequestMapping("/begin")
public void beginMap1(HttpServletRequest request) {
System.out.println("手机端初始化地图了");
别的不管,只要请求成功,控制台就会输出手机端初始化地图成功了这句话。
2.传输数据
此处随便新建一个main函数里面测试
/*要发送的json格式经纬度信息转成string*/
JSONObject jsonObject = new JSONObject();
jsonObject.put("latitude", "110.685");
jsonObject.put("longitude", "34.697");
jsonObject.put("speed", "12.0");
/*json转为string格式*/
String json = String.valueOf(jsonObject);
System.out.println(json);
/*发送地址*/
String url = "http://localhost:8080/lz/map/begin1";
String url2 = "http://localhost:8080/lz/map/change1";
sendPost(url2, json);
因为我服务器没有返回数据,所以客户端reader是不用的;
只需要调用就行了,不需要接收数据;
服务器端解析数据;
String map = "";
try {
InputStreamReader reader = new InputStreamReader(request.getInputStream(),"UTF-8");
char[] ch = new char[1024];
int len = 0;
while ((len = reader.read(ch)) != -1) {
/*char数组转换成string格式*/
map = String.valueOf(ch);
}
} catch (Exception e) {
e.printStackTrace();
}
/*处理数据转为json*/
JSONObject json = JSONObject.parseObject(map);
System.out.println("json:" + json);
/*json封装成位置信息*/
Location location = new Location();
location.setLatitude(json.getString("latitude"));
location.setLongitude(json.getString("longitude"));
location.setSpeed(Double.valueOf(json.getString("speed")));
System.out.println("location:" + location);
最后控制台就打印出客户端传来的数据;