HttpURLConnection的使用步骤:(上传数据,返回请求)
创建一个URL对象:
URL url = new URL("https://www.baidu.com");
调用URL对象的openConnection( )来获取HttpURLConnection对象实例:
HttpURLConnection con = (HttpURLConnection) url.openConnection();
设置HTTP请求使用的方法:GET(不安全) 或者POST,PUT等,HttpURLConnection默认是进行Get请求的:
con.setRequestMethod("POST");
设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头
con.setConnectTimeout(6*1000); //连接超时时间(毫秒)
con.setReadTimeout(6 * 1000); //设置从主机读取数据超时(单位:毫秒)
设置setDoOutput与setDoInput:
httpUrlConnection.setDoOutput(true); //可以使用conn.getOutputStream().write()
httpUrlConnection.setDoInput(true); //可以使用conn.getInputStream().read();
调用getOutputStream()方法向服务器进行输出:
OutputStream os = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os);
writer.write(myparams.toString()); //myparams是自己写的String类型的内容
os.close();
调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取
InputStream in = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder result = new StringBuilder();
while((line = reader.readLine()) != null){
result.append(line); //一行一行的读取到result中
}
最后调用disconnect()方法将HTTP连接关掉
con.disconnect();
总结一下:
1.通过统一资源定位器(java.net.URL
)获取连接器(java.net.URLConnection
)
2.设置请求的参数
3.输出流发送请求
4.输入流获取Response的内容
5.关闭连接
用到的知识点:
1 Uri.Builder:
一个SQL查询语句:
Uri.Builder builder = new Uri.Builder().appendQueryParameter("username",params[0]).appendQueryParameter("password",params[1]);
//数据编码一下
String query = builder.build().getEncodedQuery();
构造一个uri的时候,建议的做法是通过Uri.Builder来做,而不是简单的字符串拼接,因为常常简单的case字符串拼接是可以的,一旦涉及到复杂的、特殊字符需要urlencode的就不能很好的处理
2 字节流与字符流:
InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,主要是byte[] 数组
Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串(文本).
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
表现在
Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00- 0xffff),如果已到达流的末尾,则返回 -1
inputStream的read()虽然也返回int,但由于此类面向字节流,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值, 如果已到达流的末尾,则返回 -1
3 String,StringBuilder,StringBuffer三者的区别
运行速度快慢为:StringBuilder(变量) > StringBuffer(变量) > String(常量)
String每次使用+=操作时都会新建一个对象,把原来的对象消除掉,过程实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况,多线程不安全
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况,多线程安全(同步)
因为StringBuffer中很多方法可以带有synchronized关键字
4 setRequestProperty
主要是设置HttpURLConnection请求头里面的属性比如Cookie、User-Agent(浏览器类型)等等
httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterData.length()));
5 writer.flush()
一般都是Buffer.close() 之后进行的写出,或者满了才写出
而这个函数就是强制写出,刷新一下缓冲区
6 post:
post请求的正文是通过outputStream流写入的,但是在这并没有真正的去发送请求,只是放在了内存缓冲区,只有当getInputStream()调用的时候才真正的去请求
7HttpURLConnection是基于Okhttp的