Android同时支持TCP和UDP通信,但是大部分的网络调用是建立在TCP之上的HTTP请求完成,Android有两个用于HTTP通信的API,分别是HttpClient和HttpURLConnection。但是推荐使用HttpURLConnection,因为谷歌一直支持他,并且HttpClient在Android 6.0 以上不在支持。
一、HttpURLConnection使用
HttpURLConnection GET方式
1.创建URL对象,打开网络连接 HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
2.设置请求方式为GET conn.setRequestMethod("GET");
3.读取输入流获取响应内容 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
4.定义StringBuilder整合读取结果
<span style="white-space:pre"> </span> String line= "";
StringBuilder result = new StringBuilder();
while ((line = br.readLine())!=null){
result.append(line);
}
5.关闭输入流关闭网络 连接
conn.disconnect();
HttpURLConnection POST方式
1.创建URL对象,打开网络连接 HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
2.设置请求方式为GET conn.setRequestMethod("POST");
3.发送POST请求设置 conn.setDoInput(true); 和 conn.setDoOutput(true);
注意这两行是一定要写的,缺一不可,这是设置POST必要的条件
4.获取对应HTtpURLConnection输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), Config.CHARSET));
5.上传参数 bw.write(paramsStr.toString());
6.flush输出流缓冲 bw.flush();
7.定义StringBuilder整合读取结果
8.关闭输入输出流及网络
try{
StringBuffer paramsStr = new StringBuffer();
HttpURLConnection conn = new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, Config.CHARSET));
bw.write(paramsStr.toString());//上传参数
bw.flush();
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //定义BufferedReader输入流读取URL响应
String line= "";
StringBuilder result = new StringBuilder(); //定义StringBuilder来将读取结果添加成 一个string
while ((line = br.readLine())!=null){
result.append(line);
}
}catch (Exception e) {
e.printStackTrace();
}
finally{
out.close();
is.close();
conn.disconnect();
}
二、OkHttp使用
OkHttp是一个高效的HTTP库,允许在一个socket连接上发送多个HTTP请求,共享一个socket,可以通过连接池来减少延时请求,还可以缓存响应数据,使用时要在子线程调用, 通过handler发送结果到主线程,能显著提升网络调用性能
使用之前先添加依赖,在build.gradle中添加依赖 compile 'com.squareup.okhttp3:okhttp:3.4.1'
OkHttp GET方式
OkHttpClient mOkHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result = response.body().string();
Message message = new Message();
message.obj = result;
handler.sendMessage(message);
System.out.println(message);
}
});
在onResponse中网络请求成功时的处理方法,这里用了handler来传递消息并通知主线程修改,其中mOkHttpClient.newCall(request).enqueue(new Callback({}));这个是异步处理的,而
mOkHttpClient.newCall(request).excute();这个是同步的,如果在主线程中是不能用excute这个的,但是可以用enqueue()这个。
OkHttp POST方式
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
这是官方文档,可以看出比GET方式多添加了RequestBody
大致okHttp基本的GET和POST方法就是这么简单,亲测有效,剩下的上传下载等实验确定正确之后在来更新