上节已经实现了本地的模拟请求也返回了数据,但是在实际应用中,服务端总是在外网的,而且返回的数据会是json形式或者其他类型。
一.把代码部署到公网
1.有自己的服务器
和你本地的项目一样,安装eclipse,配置java环境,装tomcat,run,与本机localhost不同的是,你需要注意你的防火墙,把你的端口给设置允许访问,百度入网规则就可以找到,或者你直接把防火墙给关了,当然了,这是有风险的。
2.没有自己的服务器,也不想买
那你就需要内网穿透了,因为你的ip是内网ip,这个ip在收发数据时都是依靠路由器的net转化,如果你没有办法自己搞,就借助第三方吧,百度内网穿透即可。我是用的是Sunny-Ngrok,安装教程你配置完毕后,你会有一个域名,接下来你要做的就是请求时候把你的localhost改成这个IP地址即可。
二.开始发json出去(以对象转json为例子)
发json可能有很多种方法,哪怕是你自己通过class.getDeclaredFieils然后遍历,然后getName,然后拼接‘’,这也是json,只是繁琐了些,我使用Google的Gson。
使用方法:Github搜索gson下载工程,或者你去找Gson的jar包,对于这两种情况的导入方法分开说:
对于project:右键-build path-project-add;到此,你可以使用Gson,编译不会报错,但是部署之后你会发现,GG。这里就需要右键-Properties-Deployment Assembly-Add-Apply,OK这下就可以了。
对于.jar:不能像javaSE呢样复制到工程目录下了,需要复制到WebContent-WEB-INF-lib下。
好了,说了这么多,终于可以用Gson了,但是怎么用?
这里只是日常使用,至于其他繁琐的,自行百度。
Gson对象提供toJson和fromJson的方法,只是创建这个Gson对象有两种不同的方法
1.Gson gson=new Gson();这个方式创建出来的可以满足一些最基本的,比如遇到map.put("1","====");当转为json后,后面的等于号就不再是等于号了或者你的User对象有一个name字段,你在转gson时候传的user中name字段没有赋值,那么转出来的json就没有这个name字段,而不是"name":null。
2.Gson gson=new GsonBuilder().....,这个方法就可以实现自己的特殊需求了。如一般的配置:
gson = new GsonBuilder()
.enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法
.serializeNulls() //当字段值为空或null时,依然对该字段进行转换
.setPrettyPrinting() //对结果进行格式化,增加换行
.disableHtmlEscaping() //防止特殊字符出现乱码
.create();
三:开始发送吧
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
System.out.print("传递过来的数据"+request.getParameter("data"));
PrintWriter out = response.getWriter();
Data data=new Data();
data.setID(0);
data.setMessage("我是id为1的数据");
//模拟map的转化
Map map=new HashMap<>();
map.put("q", "===");
System.out.println(GsonUtil.gson.toJson(map));
out.write(GsonUtil.gson.toJson(data));
out.close();
out = null;
}
注意:如果传输失败,加入
response.setContentType("application/json");
四:接收客户端传输的json数据
BufferedReader br=new BufferedReader(new InputStreamReader(
(ServletInputStream) request.getInputStream(), "utf-8"));
StringBuffer sb = new StringBuffer("");
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
br.close();
System.out.print("传递过来的数据"+sb.toString()+"\n"+"\n");