业务场景:每次在新公司对接接口,拿出以前已经写好的app 网络请求框架可能并不能成功。调试发现。app端明明发送了请求。服务端反馈一直没有发送。这是一个困扰我多年的问题。苦于自己只会app部分。并不了解后端的代码 。只能一点点尝试。
现在接触了后端才发现原来是后端的锅。他们采用获取 请求体里面的数据的方式的不同。导致前端的请求方式的不同。后端代码如下。解释 在注释里:
package com.demo.serlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSON;
/**
* Servlet implementation class SecondSerlet
* 一个服务端接口接受get和post 请求的小测试。并且解决了中文乱码的问题
*/
@WebServlet("/ceshi")
public class SecondSerlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
// public SecondSerlet() {
// super();
// // TODO Auto-generated constructor stub
// }
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
* 网络请求的get方法,不需要过多解释
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("get"+request);
// response.getWriter().append("Served at: ").append(request.getContextPath());
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
Map<String,String>map=new HashMap();
map.put("name","这是GET返回的数据");
out.write(JSON.toJSONString(map));
out.flush();
out.close();
}
// /**
// * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
// * POST请求方法1: 获取请求体里面的数据 通过 request.getParameter()方式获取,这种方式是传统的
// * Content-Type=application/x-www-form-urlencoded方式。客户端需要使用form表单方式请求数据
// */
// protected void doPost(HttpServletRequest request, HttpServletResponse response)
// throws ServletException, IOException {
// // TODO Auto-generated method stub
// request.setCharacterEncoding("UTF-8");
// String userName = request.getParameter("name");
// System.out.println("userName是"+userName);
// response.setContentType("text/html;charset=utf-8");
// PrintWriter out=response.getWriter();
// Map<String,String>map=new HashMap();
// map.put("name","这是POST返回的数据"+userName);
// out.write(JSON.toJSONString(map));
// out.flush();
// out.close();
// }
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
* POST请求方法2:获取请求体里面的数据 通过request.getInputStream()方式获取,这种方式通过
* Content-Type=multipart/form-data方式。客户端需要使用FormData表单方式请求数据
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
Map<String,String>map=new HashMap();
map.put("name","我收到了"+ReadAsChars2(request));
out.write(JSON.toJSONString(map));
out.flush();
out.close();
}
/*
* 通过流的方式读取请求体里面的数据,并且解决掉 中文乱码的 问题
*/
public String ReadAsChars2(HttpServletRequest request){
StringBuilder buffer = new StringBuilder();
BufferedReader reader=null;
try{
request.setCharacterEncoding("UTF-8");
reader = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
String line=null;
while((line = reader.readLine())!=null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(null!=reader){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer.toString();
}
}