突发想到,自己之前的毕业设计中,用到的是HttpURLConnection进行的联网,当时也是一知半解照着教科书上的流程进行联网并通过get方式获取数据,代码量十分繁重。
在原来的HttpURLConnection基础上,进行一次联网登陆的流程大致分为:
1.获得EsitText上的数据,账号密码,通过一个LoginService方法
public static String loginByGet(String username,String password){
try{
String visit ="http://api.13550101.com/login/token?username="
+ URLEncoder.encode(username,"UTF-8")
+"&password="
+URLEncoder.encode(password,"UTF-8");
URL url = new URL(visit);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
int code=conn.getResponseCode();
if(code==200){
InputStream is = conn.getInputStream();
String text = StreamTools.readInputStream(is);
return text;
}else{
return null;
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
```来进行网络请求。
尤其注意其中的StreamTools又是一个工具类,用来对服务器返回的输入流进行获取。
<div class="se-preview-section-delimiter"></div>
public static String readInputStream(InputStream is){
try{
ByteArrayOutputStream baos=new ByteArrayOutputStream();
int len=0;
byte[] buffer = new byte[1024];
while((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
is.close();
baos.close();
byte[] result = baos.toByteArray();
String temp = new String(result);
return temp;
}catch (Exception e){
e.printStackTrace();
return "获取失败";
}
}
“`
public static String readInputStream(InputStream is){
try{
ByteArrayOutputStream baos=new ByteArrayOutputStream();
int len=0;
byte[] buffer = new byte[1024];
while((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
is.close();
baos.close();
byte[] result = baos.toByteArray();
String temp = new String(result);
return temp;
}catch (Exception e){
e.printStackTrace();
return "获取失败";
}
}
的这是对输入流的获取的一个方法。接下来,再判断String xxx = 两个方法结合 的数据是否为空,不为空再try catch块对数据进行Json解析这就是一个全部的过程。
现在开始okhttp3的过程
一直在用okhttp3联网,但是今天想用okhttp3来代替之前的HttpURLConnection联网方式。
首先,如果是get方式联网则是默认,
首先基础的是声明OkhttpClient 的对象,然后Request一个url,然后通过Response获得数据,## 重点来了 ##如果服务器返回的是Json数据,在这里String a = response.body().toString();返回的数据是错误的,想要获得Json数据,需要把toString 变成string()即可。
下面的代码则是全过程,会发现,代码比HttpURLConnection精简的多。而且这些行代码还包括了解析json数据在内。
private void getInfo() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://api.13550101.com/login/token?username=" +
"xxxxx" + "&xxxx").build();
Response response = client.newCall(request).execute();
if (response != null) {
String aaa = response.body().string();
getShow(aaa);
try {
JSONTokener jsontokener = new JSONTokener(aaa);
JSONObject jsob = (JSONObject) jsontokener.nextValue();
if(jsob.getInt("error")==1){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "error为0", Toast.LENGTH_SHORT).show();
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
到这里代码就都结束了。特意记下来表达对Okhttp3的敬畏之情,当然记得联网声明权限呦。