通过OkHttp实现基本的GET,POST等相关的请求:
OkHttp使用一般分为四个步骤:以Get请求为例
/**
* 1.拿到okHttpClient对象
* 2.构造Request
* 3.将Request封装为Call
* 4.执行Call
*/
我们写的Get请求方法:
public void doGet(View view) throws IOException {
//构造OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
//构造Request
Request request = new Request.Builder()
.get()
.url(mBaseUrl + "login?username=get&password=12223")
.build();
//执行Call
executeRequest(request);
}
其中对3,4步骤封装在了executeRequest方法中 ,具体如下:
private void executeRequest(Request request) {
Call call = okHttpClient.newCall(request);
//Response execute = call.execute();
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
L.e("onFailure:" + e.getMessage());
e.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException {
L.e("onResponse");
final String res = response.body().string();
L.e(res);
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(res);
}
});
}
});
}
先建立Call对象,执行Call.execute或Call.enqueue方法。
这里要注意的是onResponse方法其实是工作在子线程中。
这里mBaseUrl
private String mBaseUrl = "http://本机ip地址/Okhttp/"
url格式如下:
url(mBaseUrl + "login?username=get&password=12223")
Okhttp为我们服务器的项目名,login为服务器端的方法名,username和password为参数。这样我们就可以完成前后端的交互。
我们在服务端需要建立Okhttp的Web Project,同时搭建本地服务器,具体的搭建方式如下:搭建服务器Tomcat
我们建立UserAction的java源文件
建立login方法
public String login() throws IOException{
System.out.println(username + " , " +password);
HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter writer = response.getWriter();
writer.write("login success");
writer.flush();
return null;
}
得到Response对象来与客户端交互,在writer中写入了login success,那么在客户端的executeRequest的onResponse回调方法()中得到Response对象,并将login success显示在TextView中。
服务端写完login方法后还要在struts.xml中声明一下:
重启服务器,并运行AndroidStudio代码:
login success便显示在了TextView中。
其他的一些方法大体步骤相同,比如PostFile方法是将一个文件上传到服务器端
public void doPostFile(View view) {
//得到外存图片文件
File file = new File(Environment.getExternalStorageDirectory(), "shaozuo.jpg");
if (!file.exists()) {
L.e(file.getAbsolutePath() + "not exist! ");
return;
}
L.e("find pic");
//构造RequstBody
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"),
file);
//构造Request
Request request = new Request.Builder()
.url(mBaseUrl + "postFile")
.post(requestBody)
.build();
executeRequest(request);
}
这里我们在构造Request时,需要构造RequestBody,一般Post请求时都要构造RequestBody,构造RequestBody时,需要传入文件的MIME type参数。
服务器端的代码如下:
public String postFile() throws IOException{
HttpServletRequest request = ServletActionContext.getRequest();
ServletInputStream is = request.getInputStream();
String dir = ServletActionContext.getServletContext().getRealPath("files");
File file = new File(dir, "shaozuo.jpg");
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;
while( (len = is.read(buf)) != -1 ){
fos.write(buf, 0, len);
}
fos.flush();
fos.close();
return null;
}
这里服务端接受到的图片就会存放在 dir中,Okhttp\files文件夹下
运行客户端代码,当我们单击POST FILE 按钮时,我们的服务端路径下就会多一张图片,是客户端发送来的。
okhttp的使用方法具体的就是4个步骤
* 1.拿到okHttpClient对象
* 2.构造Request
* 3.将Request封装为Call
* 4.执行Call
不同请求方法也只是一些具体的细节不同(比如构造RequestBody方法不同。。),就不一一介绍了。