我自己的上一个博客账号已注销,把文章搬到这个号上!
首先来看我的请求代码
/**
* 接口调用,环信创建群组
*/
public static String httpURLGroup(RegGroup group, String POST_URL, String token) {
String war = "";
try {
URL url = new URL(POST_URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
connection.setRequestProperty("Authorization", token);
connection.connect();
DataOutputStream dataout = new DataOutputStream(connection.getOutputStream());
JSONObject obj = JSONObject.fromObject(group);
// 将参数输出到连接
dataout.writeBytes(obj + "");
// 输出完成后刷新并关闭流
dataout.flush();
dataout.close();
// TODO Auto-generated catch block
// 重要且易忽略步骤 (关闭流,切记!)
// 连接发起请求,处理服务器响应 (从连接获取到输入流并包装为bufferedReader)
BufferedReader bf = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder sb = new StringBuilder(); // 用来存储响应数据
while ((line = bf.readLine()) != null) {
line = new String(line.getBytes(), "utf-8");
sb.append(line);
}
bf.close(); // 重要且易忽略步骤 (关闭流,切记!)
connection.disconnect(); // 销毁连接
//System.out.println(sb.toString());
war = sb.toString();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return war;
}
这就是出错时的请求,请求环信IM创建社团时,一直请求回来400,然后看他的那个错误信息,说是token无效,fuc*,我的token用在用户体系中的创建用户和修改密码都可用,在这你给我说token无效。然后就去官网找了,在他的官网有一个在线验证的地方
地址:http://api-docs.easemob.com/#/
然后我把我的token和参数什么都放上去请求成功!!!!!!!!!!!!!!!!!!!!!!!
重点来了
我再创建输出流往连接里面输出携带的参数时用的是 DataOutputStream 然后我用英文和数字来请求的话就可以成功,用中文的话就会一直400.这个问题搞了我2个小时。。。。。。。
解决办法:
把 DataOutputStream 流换成 PrintWriter ,将参数输出到连接用 PrintWriter.write();
具体他们两个的区别还请往下看: -》这个区别的博主连接https://blog.csdn.net/feipeng8848/article/details/56286399
1.OutputStream
使用步骤:
获取输出流
设置中文
将字符串转换成字节数组
调用outputStream.write()
这里只贴出doGet方法的内容:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取OutputStream输出流
OutputStream outputStream = response.getOutputStream();
//设置中文
response.setHeader("content-type", "text/html;charset=UTF-8");
String data = "你好,这里是通过OutputStream的方式向网页输出内容";
//将字符转换成字节数组,并且指定UTF-8编码
byte[] dataByteArr = data.getBytes("UTF-8");
// 输出
outputStream.write(dataByteArr);
}
2.PrintWriter
使用步骤:
设置文档类型和编码方式
获取getWriter()
输出
也是只贴出doGet方法的内容:
// 设置响应内容类型与编码方式
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("你好,这里是通过PrintWriter的方式向网页输出内容");
3.总结
OutputStream是以字节的方式输出,PrintWriter是以字符的方式输出。
类似字节流与字符流的差别