前面已经进行了okhttp的get的请求,现在进行okhttp的post请求,get请求快,方便,不安全,post请求的参数通过流传递过去的,下面看post是如何进行请求的。
1.首先创建一个请求客户端
OkHttpClient okHttpClient = new OkHttpClient();
2.创建请求对象之前,需要创建一下请求的参数FormBody,里面采用键值对的方式,就是把url拆了相比于get
FormBody body=new FormBody.Builder().add("showapi_appid","48962") .add("topid","5") .add("showapi_sign","9ad486a2461e47f4b3391171911f5b4b").build();3.在创建一条请求
Request request=new Request.Builder().url("http://route.showapi.com/213-4").post(body).build();4.执行请求,异步请求有一个callback的回调,这个时候请求成功的话需要在发一个handler或runOnUiThread(),这个方法也是可以的。
okHttpClient.newCall(request).enqueue(callback);5.现在拿到了数据,一大堆数据,需要把它解析成对象,一首一首拆出来,json解析,相比于xml解析代码少的多,东西比xml少,一个json如何变成对象。
第一种:jsonobject解析 好处:只解析想要的部分。第二:gson解析,一建解析
首先第一种解析创建一个class,javabean包,然后在自己一步步写,很麻烦,容易出错,就不写了,写不好。
然后第二种解析安卓里面有一个插件一建生成对象。如何打插件呢?
1.setting里面的Plugins,选择中间那个Browes reposition就可以了进行仓库下载
//这个是完整的okhttp的post请求加json解析的代码
2.建一个class,叫jostop,同时通过安卓studio生成构造Alt+Ins快速生成构造点击里面的JsonFormat,然后复制json代码到里面,就ok了
3.有了对象,有解析方式如何解析
Gson gson=new Gson();
4.采用gson的fromJson的方法,把一个字符串转换成为一个jsontop对象,拿到了Json对象就可以拿到里面的东西了
josntop bean=gson.fromJson(response.body().string(),josntop.class); final ArrayList5.不发handler了,直接使用这个办法进行展示,在子线程中调用runOnUiThread();list= (ArrayList ) bean.getShowapi_res_body().getPagebean().getSonglist();
runOnUiThread(new Runnable() { @Override public void run() { // Iterator it1 = list.iterator(); // while(it1.hasNext()){ //// TEX.setText(); // // } for(int i=0;i// Log.e("msg", list.get(i).getSingername()+""); TEX.append(list.get(i).getSingername()); } } }); } };
//post完整代码
public class networkActivity extends AppCompatActivity { private Button butt; private TextView TEX; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //规定传1代表有数据 // butt.setText(buff.toString()); // TEX.setText(buff.toString()); if(msg.what==2) { TEX.setText(msg.obj.toString()); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_network); butt = (Button) findViewById(R.id.button); TEX = (TextView) findViewById(R.id.textView6); // httpconn(); // okhttp(); post(); }
public void post() { OkHttpClient okHttpClient = new OkHttpClient(); FormBody body=new FormBody.Builder().add("showapi_appid","48962") .add("topid","5") .add("showapi_sign","9ad486a2461e47f4b3391171911f5b4b").build(); Request request=new Request.Builder().url("http://route.showapi.com/213-4").post(body).build(); Callback callback=new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { // Message mes=new Message(); // mes.obj=response.body().string(); // mes.what=2; // handler.sendMessage(mes); Gson gson=new Gson(); josntop bean=gson.fromJson(response.body().string(),josntop.class); final ArrayListlist= (ArrayList ) bean.getShowapi_res_body().getPagebean().getSonglist(); // final String res=response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { // Iterator it1 = list.iterator(); // while(it1.hasNext()){ //// TEX.setText(); // // } for(int i=0;i // Log.e("msg", list.get(i).getSingername()+""); TEX.append(list.get(i).getSingername()); } } }); } }; okHttpClient.newCall(request).enqueue(callback); } }