okhttp的get、post请求
okhttp网络请求框架
这里粗粗介绍一下okhttp:比较完备的网络请求框架。
1、get请求
get请求分同步请求和异步请求两种方式:
get同步请求:
先上代码,这是我的程序代码:
//同步get请求
private void getSync() throws Exception
{
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
request=new Request.Builder() //请求对象,设置的参数详细要看源码解释
.url(BASE_URL) //这里的url参数值是自己访问的api
.build();
Response response = null; //建立一个响应对象,一开始置为null
Call call = client.newCall(request); //开始申请,发送网络请求。
response = call.execute();
if (response.isSuccessful()) {
Log.d("kwwl", "response.code()==" + response.code());
Log.d("kwwl", "response.message()==" + response.message());
Log.d("kwwl", "res==" + response.body().string());
// text.setText("同步请求成功");
//此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。
}
else
{
text.setText("同步请求失败");
Log.d("Fail","get请求失败");
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}).start();
}
url参数值:详细的书写要看api申请的api书写规定,如我的url规定是:http+key,两者都是在申请api之后会有的数据。
注意到Call对象是用client.newCall(request)来初始化,也就是说已经发送网络请求了,client就是客户端okhttpClient对象,将请求的结果返回给call,因此call有了响应成功或失败的结果。
而call.execute()返回的就是response的情况,也就是response类对象,所以接下来就用response.isSuccessful来判断是否请求成功,以决定接下来的动作。

get异步请求:
//异步请求
public void getAsync() throws Exception
{
request=new Request.Builder()
.url(BASE_URL)
.build();
Call call=client.newCall(request);
call.enqueue(new Callback() { //与同步的不同点:Callback
@Override
public void onFailure(Call call, IOException e) {
Log.d("TAG",BASE_URL);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
final String result=response.body().string();
runOnUiThread(new Runnable() { //回到UI主线程
@Override
public void run() {
text.setText(result);
}
});
}
}
});
}
异步请求和同步请求的代码差不多,关键在于异步请求多了利用Callback类来进行更细致的网络请求分析:
onFail和onResponse方法:
在我的理解中,这两者在网络请求的过程中起到的作用是:判断能否把请求发出去,比如,这个网络不接受get请求,那么你用get请求当然就不会成功了,这也是请求失败的一种,但是get异步请求把请求失败(广义)分成两种,能发送与不能发送,能发送成功在来分成能请求成功和因为其他原因的请求失败(狭义);
重点内容:注意到异步请求中有一个方法runOnUiThread(),返回主线程,为什么要返回主线程呢,因为虽然没有像同步请求那样明着写代码说另开一个子线程,但是这里在发送请求时,已经自己开启了一个子线程,所以现在要回到textView文本框中输入,就应该回调主线程。如果没有这个方法,直接setText的话,就会报错啦。

2、post请求:
post请求也分两种,嘻嘻,我也只学了异步请求,跟get的异步很相似
post异步请求:
//post 请求
private void postAsync() throws Exception
{
final String url = " http://apis.haoservice.com/lifeservice/Joke/ContentList?pagesize=10&page=1&key=8b3264c50ab346f39d1b4eac0dd5bc1c"; //我自己请求的api
RequestBody formBody = new FormBody.Builder() //创建表单请求体,具体的参数设置也要去看源码才更清楚
.add("username","17wwshe") //自己设的,不要盗用我的名儿!
.build();
request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody)//传递请求体 //与get的区别在这里
.build();
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
Log.d("TAG post失败",url);
}
@Override
public void onResponse(Call call, Response response) throws IOException
{
if(response.isSuccessful())
{
final String content=response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("TAG post成功",content);
text.setText(content);
}
});
}
else
{
Log.d("PostFail ",url);
}
}
});
}
//成功!!

这里面的变量有点多,要仔细看才知道哪里是哪里。
更多推荐


所有评论(0)