HttpURLConnection用于在程序中访问服务器资源,
向服务器发出请求,获取响应
URL url = new URL("http://localhost:8080/xxxx/xxxxxx");
java.net.HttpURLConnection conn=
(HttpURLConnection)url.openConnection()
HttpURLConnection是URLConnection的子类型
conn.setRequestMethod("GET")[可选]
必须大写,默认是GET,可以设置为POST
采用GET方式,在connect之后直接获取response code即可;
可选conn.setDoInput(boolean)
默认值true,本connection能够从服务器读取
必须在获取输入流/输出流之前设置
否则java.lang.IllegalStateException: Already connected
可选conn.setDoOutput(boolean dooutput)
默认值false,如果设置为true,则本connection能够向服务器写出参数
否则java.lang.IllegalStateException: Already connected
HttpURLConnection
两种请求方式特点
GET方式请求的参数会在URL上以键=值对的方式展示出来,
这里会有大小限制(1024字节),也不安全,可以看到敏感信息。
POST方式请求的参数被封装起来以流的形式发送给服务端,
没有大小限制,相对安全。看不到敏感信息。(推荐)
案例1:从网络读取,
向文件写出.
改进:下载文件先向内存中写出,
再一次性把内存中的内容写到本地文件中
接口回调复习
CallBack接口
void callPhone();
场景类Client实现CallBack接口
创建线程时传this过去,
耗时操作完成后调用callPhone()方法
也可以用匿名内部类方式进行接口回调:
UrlUtils.getContent(path, new DownloadCallback() {
public void load(byte[] data) {...}
});
在getContent方法中,启动线程下载path指定的网络上的资源并写出到内存中,
完成下载后,回调load方法写出到本地文件中.
案例2:封装HttpUtils工具类,
下载自己服务器上的图片
指定资源的url和要保存到的本地路径,下载文件
HttpUtils.
downloadFileGet(String url, String targetFileName)
案例3:发送用户名&密码到服务器注册
(封装到URL中用GET方式提交),
服务器硬编码返回注册成功或失败,
客户端用readLine()读服务器返回的信息
练习1.(注册):从控制台获取用户名和密码,通过http的get请求方式,
访问服务器,在服务器中注册,服务器回应是否注册成功。
day28_httpurlconnection.DemoHttpURLConnection04
MyUtil.regist(name, pass),将用户名和密码存入集合或数据库
练习2.(登录):从控制台获取用户名和密码,通过http的get请求方式,
访问服务器,在服务器中登录,服务器回应是否登录成功。
day28_httpurlconnection.DemoHttpURLConnection05
案例4:POST提交数据,
客户端用readLine()读服务器返回的信息
URL url = new URL("http://localhost:8080/day28_t/Servlet02");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
//默认是GET方式,注意"POST"大写
conn.setDoOutput(true);
设置为允许向服务器写出数据,
默认是不允许写出数据(false)
//需要先发送参数到服务器
OutputStream os = conn.getOutputStream();
//写出请求参数
os.write("username=zhangsan&pass=123".getBytes());
//再获取响应码,输入流
if(conn.getResponseCode() == 200){
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println(br.readLine());
}
步骤:URL-->HttpURLConnection-->setRequestMethod()-->setDoOutput()-->connect()-->getOutputStream(),write(请求参数),flush()-->getResponseCode()-->getInputStream()
conn.connect();
java.net.ConnectException: Connection refused: connect
原因:服务器没有启动
OutputStream os = conn.getOutputStream()
前提:
先要conn.setRequestMethod("POST");//注意大写
conn.setDoOutput(true);
否则会报java.net.ProtocolException:
Cannot write output after reading input.
此处getOutputStream会隐含的进行connect
os.write("username=zhangsan&pass=123".getBytes());
os.flush();
int code = conn.getResponseCode()
在connect()和write()之后,getInputStream()之前调用.
如果服务器无法连接会返回404
正常情况下返回的是200
InputStream is = conn.getInputStream()
将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。
URL类的openStream()也可以得到InputStream