使用Github上开源库完成http通讯和json解析
一、准备工作
1、两个github上星标最多的库,可用于http通讯:
okhttp和retrofit
配置如下:
implementation 'com.squareup.retrofit2:retrofit:2.7.0'
implementation ("com.squareup.okhttp3:okhttp:4.2.2")
2、FastJson或Gson进行Json解析
在Moudle
的build.gradle
中添加:
compile 'com.alibaba:fastjson:1.2.61'
或
Gson
implementation 'com.google.code.gson:gson:2.8.6'
3、使用阿里巴巴远程仓作为仓库添加
alibaba仓
替换project
的build.gradle
中的代码:
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public/' }
mavenLocal()
mavenCentral()
}
}
4、建立一个本地的服务器
以Apache为例
二、建立工程
参考《第一行代码-Android》
1、配置Okhttp
compile 'com.squareup.okhttp3:okhttp:4.2.2'
2、在Manifest中注册
<uses-permission android:name="android.permission.INTERNET"/>
3、MainActivity中代码
//在按钮事件中调用这个函数,并将结果显示到textview中
package edu.ujs.ac.httpjson;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private static final int GET = 1;
private Button mBtnSend;
private TextView mTextResult;
private String mStrUrl = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
//private OkHttpClient client = new OkHttpClient();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnSend = findViewById(R.id.button);
mTextResult = findViewById(R.id.textView);
// Request request = new Request.Builder()
// .url("http://www.baidu.com")
// .build();
mBtnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//动作代码
//sendRequestWithOkHttp();//不封装的Okhttp
//sendRequestWithHttp();//自定义封装接口
sendRequestWithOk();//封装的OkHttp
}
});
}
/**
* 调用封装的Okhttp接口
*/
private void sendRequestWithOk(){
HttpUtil.sendOkHttpRequest(mStrUrl,new okhttp3.Callback(){
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseData = response.body().string();
showResponse(responseData);
}
@Override
public void onFailure(Call call, IOException e) {
}
});
}
/**
* 调用封装的Http接口
*/
private void sendRequestWithHttp(){
HttpUtil.sendHttpRequest(mStrUrl, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
//
showResponse(response);
}
@Override
public void onError(Exception e) {
}
});
}
/**
* 不封装的okHttp调用
*/
private void sendRequestWithOkHttp(){
new Thread(new Runnable(){
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.kuaidi100.com/query?type=yuantong&postid=11111111111")
//.url(mStrUrl)
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
parseJSONWithGSON(responseData);
showResponse(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 处理返回的json数据
* @param jsonData
*/
private void parseJSONWithGSON(String jsonData) {
Gson gson = new Gson();
// Trailer trailers = gson.fromJson(jsonData,Trailer.class);
// List<Trailer.TrailersBean> trailerList = trailers.getTrailers();
// Log.e("Main",""+trailerList.size());
// for(Trailer.TrailersBean trailer : trailerList){
// Log.e("Main","id is" +trailer.getMovieName());
// }
Express express = gson.fromJson(jsonData,Express.class);
List<Express.DataBean> dataBeanList = express.getData();
for(Express.DataBean data : dataBeanList){
Log.e("main", "parseJSONWithGSON: "+data.getContext());
}
//Log.e("Main", "parseJSONWithGSON: "+express.getData().size() );
}
/**
* 将返回的数据显示在textview中
* @param response
*/
private void showResponse(final String response){
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextResult.setText(response);
}
});
}
}
2、封装Http请求方法
这里封装了两种
一种是原生的http请求
另一种是okHttp方法
package edu.ujs.ac.httpjson;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/**
* Created by ancheng on 2019/12/19.
*/
public class HttpUtil {
/**
* 使用自定义的回调方法
* @param address 地址
* @param listener 回调
*/
public static void sendHttpRequest(final String address,final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try{
URL url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while((line = reader.readLine())!=null){
response.append(line);
}
//return response.toString();
//回调方法
if(listener != null){
listener.onFinish(response.toString());
}
} catch (Exception e) {
e.printStackTrace();
//return e.getMessage();
//回调方法
if(listener != null){
listener.onError(e);
}
}finally {
if(connection!=null){
connection.disconnect();
}
}
}
}).start();
}
/**
* 使用OkHttp的请求方法
* @param address 地址
* @param callback 回调
*/
public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
}
/**
* 封装的okhttp的post方法,用于post带参数的请求。
* @param url 请求地址
* @param json json字段
* @param callback 回调处理
* @throws IOException
*/
public static void okHttpPost(String url,String json,okhttp3.Callback callback) throws IOException {
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON,json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call c = client.newCall(request);
c.enqueue(callback);
}
}
自定义回调接口
package edu.ujs.ac.httpjson;
/**
* Created by ancheng on 2019/12/19.
*/
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}