Android6.0(API23)系统之后,Android上发送HTTP请求的方式只有一种HttpUrlConnection
基本用法:通过一个执行路径的URL,获取到HttpUrlConnection对象,然后就可以获取到服务器端的二进制数据,最后将二进制数据转为可以阅读的的数据。
public class HttpUrlConnectionActivity extends AppCompatActivity {
private TextView tvShowNet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvShowNet = (TextView) findViewById(R.id.tv_show);
}
public void http(View view) {
//开启线程请求网络
new Thread(new Runnable() {
@Override
public void run() {
try {
//1.创建URL对象(传入一个路径)
URL url = new URL("https://www.baidu.com/");
//2. 获取HttpURLConnection对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//3.设置请求方法(默认是GET,用来向服务器请求数据,POST用来向服务器提交数据)
connection.setRequestMethod("GET");
//4.设置其他的参数,比如请求超时、读取超时毫秒数、服务器返回的状态码等等
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
//状态码为200的时候,说明和服务器成功连接
int code = connection.getResponseCode();
Log.i("--", "状态码:" + code);
//5. 获取从服务器返回的输入流
if (code == 200) {
InputStream in = connection.getInputStream();
//6.对二进制流进行读取
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
//显示数据
showURLText(sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}).start();
}
private void showURLText(final String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvShowNet.setText(s);
}
});
}
}
当然我们在开发中都是使用封装好的库进行访问网络,比如okhttp
GET请求:
//开启子线程访问网络
new Thread(new Runnable() {
@Override
public void run() {
try {
//1.创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//2.创建Request对象
Request request = new Request.Builder().url("https://www.baidu.com/").build();
//3. 同步请求
// Response response = client.newCall(request).execute();
// 4.异步请求
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String s = response.body().string();
if (s != null) {
showText(s);
}
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}).start();
POST请求:其实比get多了一个创建表单并往表单增加数据的步骤
//开启子线程访问网络
new Thread(new Runnable() {
@Override
public void run() {
try {
//1.创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//2.创建RequestBody对象
RequestBody requestBody = new FormBody.Builder()
.add("username", "tom")
.add("password", "123")
.build();
//3.创建Request对象
Request request = new Request.Builder()
.post(requestBody)
.url("https://www.baidu.com/")
.build();
//4. 同步请求
// Response response = client.newCall(request).execute();
//5.异步请求
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String s = response.body().string();
if (s != null) {
showText(s);
}
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}).start();
我们可以看到okhttp已经封装的比较屌了,但是还是需要各种切换线程,所以推荐使用OkGo,简单到哭
public void okGo(View view) {
OkGo.<String>get("https://www.baidu.com/").tag(this).execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
tvOkGo.setText(response.body().toString());
}
@Override
public void onError(Response<String> response) {
}
});
}
https://github.com/jeasonlzy/okhttp-OkGo