网络访问 URL,HttpURLConnection及 HttpClient:

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hana_one/article/details/52563267
URL 统一资源定位器


url访问的格式:
网络协议类型(http)+主机ip(localhost或者172.168.20.2(根据具体情况而定))
+端口号(例如8080)+服务器上的具体资源路径(myweb/zhuce.html)
String path="http://localhost:8080/myweb/zhuce.html";


使用url访问服务器时:
1.用url读取数据
URL url = new URL("http://localhost:8080/myweb/index.html");
服务器以流的形式响应:
InputStream is=url.openStream();
//对响应流进行封装:
BufferedReader reader=new BufferedReader(new InputStreamReader ( is ));
//进行数据的读取,保存
String line="";
StringBuilder builder=new StringBuilder();
while((line=reader.readLine())!=null){//把读取到的值传给line
//当读取的数据不等于空的时候追加到 bulider

builder.append(line);

}
2.把读取的数据写入,或者说是下载到本地
跟1.一样,首先我们得到url的输出流
InputStream is=url.openStream();
//然后拿到文件的输出流
FileOutputStream fs=new FileOutputStream("c:/3"+File.separator+fileName);
//开始写入数据
byte [] buffer=new byte[1024];
int len=0;
while((len=is.read(buffer)!=-1)){
fs.write(buffer,0,len);
}
//这样就把从网络服务器上读取的数据写入到本地


HttpURLConnection:
1.url的请求分为两类:get和post
 1)get请求可以获取静态页面,也可以把请求参数放在URL字符串后面,传递给servlet
Get方式的提交的特点:


   通过地址重写的式将提交的数据
  以键值对的方式追加在重写地址之后。
  以get方式提交数据的大小是有限制,不能超过2KB,
  此种提交方式如果是通过浏览器向服务器端提交,
  则会有一定的安全隐患。


   2) Post方式的提交的特点:


    将提交的数据重新打包转换成字节流,单独进行提交,
    并没有将提交的数数据重写并追加在地址后。
  此种提交方式如果是通过浏览器向服务器提交的话
  会比较安全,而且对提交的数据的大小是没有限制的。

2.以注册和登陆为例分析使用HttpURLConnection的不同:

1)在使用get方法登陆:
//直接把登陆信息放在url路径中
a)URL url=new URL("http://localhost:8080/myweb/DoLogin?username=admin&password=000000");



b)获得把登陆的信息封装到Map<String,String>集合中//在追加到路径中去


Map<String, String> params = new HashMap<String, String>();
params.put("username", name);
params.put("password", password);

//追加
StringBuilder builder = new StringBuilder();
builder.append(path);//为服务器路径
builder.append("?");
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.append(entry.getKey());
builder.append("=");
builder.append(entry.getValue());
builder.append("&");
}
String urlPath = builder.deleteCharAt(builder.length() - 1).toString();//带有登陆信息的路径


//得到HttpURLConncection对象
URLConnection rulConnection = url.openConnection();  
       // 此处的urlConnection对象实际上是根据URL的   
           // 请求协议(此处是http)生成的URLConnection类   
           // 的子类HttpURLConnection,故此处最好将其转化   
            // 为HttpURLConnection类型的对象,以便用到   
            // HttpURLConnection更多的API.如下:   
     
HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();
//设置httpURLConnection的属性
httpUrlConnection.setRequestMethod("GET");//设定请求的的方法为GET:默认情况下为GET: 

httpURLConnection.setConnectTimeout(5000);//设置连接超时时间

等其他设置:

//得到请求的响应码:

int code = httpURLConnection.getResponseCode();
//判断响应码:
if (code == 200) {
InputStream is = httpURLConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = "";
StringBuilder strBuilder = new StringBuilder();
while ((line = reader.readLine()) != null) {
strBuilder.append(line);
}
String jsonStr = strBuilder.toString();
// 把jsonStr转化成JSONObject
JSONObject jsonObject = new JSONObject(jsonStr);
String result = jsonObject.getString("result");
if ("ok".equals(result)) {
flag = true;
} else {
flag = false;
}
} else {
Log.i("code", "code:" + code);
}
2)以POST方式登陆:

需要把登陆的信息数据重新打包转换成字节流,单独进行提交
//使用Map<String,String>集合封装登陆信息:

Map<String, String> params = new HashMap<String, String>();
params.put("username", username);
params.put("password", password);
StringBuilder builder = new StringBuilder();
//与get不同的不需要再后面追加?号,而是直接把数据封装
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.append(entry.getKey());
builder.append("=");
builder.append(entry.getValue());
builder.append("&");

// 输入的字符
String str = builder.deleteCharAt(builder.length() - 1).toString();
// 把输入的字符转化为字节
byte[] datas = str.getBytes();
//提交到服务器中


URL url = new URL(path);
HttpURLConnection hConnection = (HttpURLConnection) url.openConnection();


hConnection.setRequestMethod("POST");//默认情况下为GET方法,需要设置
hConnection.setConnectTimeout(5000);//设置连接超时时间
hConnection.setDoOutput(true);//设置是否向httpURlConnncetion输出,(向服务器端写数据)
因为是post请求,参数要放在http正文内,因此需要设为true,默认请况下为false

hConnection.setDoInput(true);// 设置是否从httpUrlConnection读入,默认情况下是true;  

hConnection.setUseCaches(false); // Post 请求不能使用缓存 

设定传送的内容类型
hConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
hConnection.setRequestProperty("Content-Length", datas.length + "");


//把登陆信息数据写入服务器
OutputStream os = hConnection.getOutputStream();//此出包含了hConnection.connect();
os.write(datas);
os.flush();
os.close();

//得到响应码:
int code = hConnection.getResponseCode();
//判断响应码
if (code == 200) {
InputStream is = hConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String str1 = "";
StringBuilder builder2 = new StringBuilder();
while ((str1 = reader.readLine()) != null) {
builder2.append(str1);
}
String jsonStr = builder2.toString();
JSONObject jsonObject = new JSONObject(jsonStr);
String result = jsonObject.getString("result");
if (result.equals("ok")) {
flag = true;
} else {
flag = false;
}
} else {
Log.i("TAG", "CODE:" + code);
}
HttpClient:

一、简介
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
下载地址: http://hc.apache.org/downloads.cgi
二、特性
1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1
2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支持HTTPS协议。
4. 通过Http代理建立透明的连接。
5. 利用CONNECT方法通过Http代理建立隧道的https连接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。
7. 插件式的自定义认证方案。
8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。
9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
10. 自动处理Set-Cookie中的Cookie。
11. 插件式的自定义Cookie策略。
12. Request的输出流可以避免流中内容直接缓冲到socket服务器。
13. Response的输入流可以有效的从socket服务器直接读取相应内容。
14. 在http1.0和http1.1中利用KeepAlive保持持久连接。
15. 直接获取服务器发送的response code和 headers。
16. 设置连接超时的能力。
17. 实验性的支持http1.1 response caching。
18. 源代码基于Apache License 可免费获取。
三、使用方法
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
1. 创建HttpClient对象。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6. 释放连接。无论执行方法是否成功,都必须释放连接
四:实例:
以登陆为例:
以post方法向服务端发送请求:
首先获得HttpClient对象:
//AbstratHttpClient是HttpClient直接实现类 
//DefaultHttpClient 又实现AbstratHttpClient

HttpClient client=new DefaultHttpClient();//创建HttpClient对象。

HttpPost post=new  HttpPost(path);//以post方法向服务端发送请求:

post.setParams(HetpParams params);
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
BasicNameValuePair pair = new BasicNameValuePair("username", name);
BasicNameValuePair pair2 = new BasicNameValuePair("password", password);
parameters.add(pair);
parameters.add(pair2);


try {
HttpEntity entity = new UrlEncodedFormEntity(parameters);
//发送请求参数setEntity(HttpEntity entity)方法来设置请求参数。
post.setEntity(entity);
HttpResponse response = client.execute(post);//该方法返回一个HttpResponse
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
//获取HttpEntity对象,该对象包装了服务器的响应内容
HttpEntity resEntity = response.getEntity();
String jsonStr = EntityUtils.toString(resEntity);
JSONObject jsonObject;
jsonObject = new JSONObject(jsonStr);
String result = jsonObject.getString("result");
if (result.equals("ok")) {
flag = true;
} else {
flag = false;
}
} else {
Log.i("TAG", "CODE:" + statusCode);
}






































猜你喜欢

转载自blog.csdn.net/Hana_one/article/details/52563267