1.HttpUrlConnection类概述
HttpUrlConnection是一个HTTP协议的UrlConnection,用于通过web收发数据。数据可以是任意类型和长度。这个类主要用于收发提前不知长度的数据流。
这个类的用法遵循以下模式:
- 首先获得一个HttpUrlConnection的实例。通过调用URL类中的openConnection()函数。并做强制类型转换。
- 准备请求。请求的基本属性是一个URL,请求头可能包含一些元数据,比如:证书, 首选的内容类型,session和cookie等。
- 可选的上传一个请求体。HttpUrlConnection的实例如果包含一个请求体的话,必须使用setDoOutput(true)函数设置一下。然后可以通过getOutPutStream获得一个输出流,向流中写入数据即可传输数据。
- 读响应。典型响应头包含着这样一些元数据,比如:1.响应体的内容类型和长度,2.修改的日期,3.session和cookie等。响应体可以从getInputStream()返回的流中读取。如果响应没有响应体,getInputStream()返回为空。
- 断开连接。一旦响应体被读取,HttpUrlConnection应该通过调用disconnect()方法来关闭。这个关闭会释放这个连接所持有的资源。
根据上述要求,初步写如下实验程序,这个程序的功能就是向服务器发送一个请求,并获得服务器的响应,把这些响应显示在一个TextView中。
<span style="font-family:SimSun;font-size:14px;">public class MainActivity extends AppCompatActivity {
URL url = null;
TextView textView;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text);
Log.d("hello","oncreate");
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.d("hello",msg.getData().getString("name"));
textView.setText(msg.getData().getString("name"));
return true;
}
});
new Thread(new Runnable() {
HttpURLConnection connection;
@Override
public void run() {
try {
url = new URL("https://www.baidu.com/?tn=57095150_1_oem_dg");
connection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line=bufferedReader.readLine())!=null){
stringBuilder.append(line);
}
Message message = new Message();
Bundle bundle= new Bundle();
bundle.putString("name",stringBuilder.toString());
message.setData(bundle);
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
connection.disconnect();
}
}
}).start();
}
}</span>
这段代码访问https://www.baidu.com/?tn=57095150_1_oem_dg页面,并把获得的内容放到Textview中显示。需要注意的几点:
- Android的Ui线程不可以访问网络等耗时的工作,所以这里将其放在一个子线程中。
- TextView一页可能显示不完,最好把TextView放到一个ScrollView中,这样就可以向下滚动查看所有内容了。
- 使用Handler和Message更新UI.
- 不要忘记添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
1.2.基于HTTPS安全连接
首先也是使用openConnection()方法获得一个
HttpsURLConnection
实例。这个URL当然是使用“https://”开头的URL.它允许覆写
HostnameVerifier
和SSLSocketFactory接口。一个支持SSLSocketFactory的应用程序可以提供一个自定义的X509TrustManager,
用于证书链的验证,并且一个自定义的X509KeyManager用于客户端的验证。
1.3.发送内容
1.3.发送内容
为了上传数据到服务器,配置连接为输出,使用setDoOutput(true)