您的位置:首页 > 理论基础 > 计算机网络

妈妈再也不用担心我不会okhttp的服务器和客户端的传值了

2017-05-20 16:16 309 查看
本人用的服务器是tomcat+servlet,对应的servlet映射都是在web.xml中配置的!(为简单起见,本人没有用到structs之类的框架)

1、异步get的传值:

客户端:

	public void doGet() throws IOException {//该方法只需要在客户端的onCreate方法中调用即可。

// 1、拿到okhttpclient对象

//2、 构造request,在此设置get或post方法,同时向服务器传递一些参数
Request.Builder builder = new Request.Builder();
Request request = builder.url("www.baidu.com").build();//这里直接请求百度服务器,客户端可以通过 String res = response.body().string();直接返回其源码

executeRequst(request);
}

private void executeRequst(Request request){
//3、将request封装为call,是单个请求的执行者
Call call = okHttpClient.newCall(request);
//4、执行call(异步和同步)
// call.execute();
call.enqueue(new Callback() {//异步执行

@Override
public void onResponse(Response response) throws IOException {
String res = response.body().string();
getActivity().runOnUiThread(new Runnable() {

@Override
public void run() {

mTv.setText(res);//动态设置textView的值
}
});

}

@Override
public void onFailure(Request arg1, IOException e) {

String json = e.getMessage();  
}
});
}

2、异步post一个键值对:

客户端:

public void doPost(View view) {

FormEncodingBuilder requestBodyBuilder = new FormEncodingBuilder();
// 2构造request请求
// 2.1构造requestBody(get请求不需要requestBody)
RequestBody requestBody = requestBodyBuilder
.add("userName", userName.getText().toString())
.add("userPwd", userPwd.getText().toString()).build();// 将输入的值传到服务器端
Request.Builder builder = new Request.Builder();
Request request = builder.url(urlutil.url + "loginServlet").post(requestBody)
.build();
executeRequst(request);
}

private void executeRequst(Request request) {
// 3、将request封装为call,是单个请求的执行者
Call call = okHttpClient.newCall(request);
// 4、执行call(异步和同步)
// call.execute();
call.enqueue(new Callback() {// 异步执行

@Override
public void onResponse(Response response) throws IOException {
if (response.isSuccessful()) {

final String res = response.body().string();
System.out.println("获取从服务器的数据" + res);
runOnUiThread(new Runnable() {

@Override
public void run() {

}
});
}
}

@Override
public void onFailure(Request arg1, IOException e) {

String json = e.getMessage();
}
});
}


服务器:

public class LoginServlet extends HttpServlet {

public LoginServlet() {
super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameters("userName");
String userpwd = request.getParameters("userPwd");//服务器通过这种方式接收客户端对应键值对的值

PrintWriter writer = response.getWriter();
writer.write("success");//这里可以向客户端返回相应的字符串,客户端可用String res=response.body().string();来接收该值
writer.flush();
writer.close();//注意刷新和关闭缓存

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);

}接下来是web.xml中的配置:
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.compus.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>


3、异步post一个字符串(包括json串):
客户端:

public void doPostString() {

// c
9be7
reate方法:参数1:MediaType contentType设置类型和格式 参数2:可以传递json字符串

//声明:public static final MediaType JSON = MediaType.parse("application/json; charset=gb2312");
RequestBody requestBody = RequestBody.create(JSON, XXXX);//XXXX指的是一个json串
Request.Builder builder = new Request.Builder();
Request request = builder.url(urlutil.url + "registerServlet").post(requestBody).build();executeRequst(request);
}
private void executeRequst(Request request) {
// 3、将request封装为call,是单个请求的执行者
Call call = okHttpClient.newCall(request);
// 4、执行call(异步和同步)// call.execute();
call.enqueue(new Callback() {
// 异步执行
@Override
public void onResponse(Response response) throws IOException
{if (response.isSuccessful())
{
final String res = response.body().string();System.out.println("获取从服务器的数据" + res);
runOnUiThread(new Runnable() {
@Override
public void run()
{

}
});
}
else {
throw new IOException("RegisterActivity have unexpect codeee" + response);
}
}
@Override
public void onFailure(Request arg1, IOException e)
{
String json = e.getMessage();}});
}

服务器端:
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public RegisterServlet() {
super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// 客户端将json字符传到服务器
ServletInputStream is = request.getInputStream();
StringBuilder sb = new StringBuilder();
int len = 0;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1)// 将内容读到buffer里面,如果没有读到文件的末尾,那么执行循环体
{
sb.append(new String(buf, 0, len));// 开始,索引和结束的位置,将读取的buffer转为字符串append到stringbuilder里面去
}
System.out.println(sb.toString());
String json = sb.toString();//到这里便接收了客户端传过来的json串的值
Gson gson = new Gson();
UserInfo user = gson.fromJson(json, UserInfo.class);

String getUserName = user.getUserName();
String getUserPwd = user.getUserPwd();
RegisterService rs = new RegisterServiceImpl();
UserInfo newuser =rs.Register(getUserName, getUserPwd);

PrintWriter writer = response.getWriter();
if (newuser == null) {
System.out.println("数据库没有该用户,可以注册。。");
int userAdd = rs.RegistCount(getUserName, getUserPwd,getUserRealName);
writer.write("success");// 可以通过这种方式向客户端传递json串

} else {
System.out.println("用户名已存在,无需注册。。");
writer.write("fail");// 可以通过这种方式向客户端传递json串
}
writer.flush();
writer.close();

}

}


接下来是服务器中的web.xml中的配置:
<servlet>
<servlet-name>registerServlet</servlet-name>
<servlet-class>com.compus.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>registerServlet</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
总结:

如果客户端向服务器传一个简单的字符串,直接使用post键值对传值的方式即可,对应服务器接收值只需要用String a = request .getParameters("xxxx");就行了。如果要传的值比较复杂,那么就是用post一个json串的方法来出来,然后通过流和缓存的方式接收客户端穿过来的值。

服务器向客户端返回处理结果的话一般就是通过PrintWriter的writer方法,该方法可以传递一个简单的字符串,也可以传递一个json串,非常方便!客户端要接受服务器的值的话就通过String res = response.body().string();的方式。

具体的还有一些上传文件和流的代码目前正在研究,后续再写,目前就写这么些吧!

具体的还有一些参考资料:

1、okhttp使用进阶 译字okhttp github官方教程

2、Android okhttp完全解析 是时候来了解okhttp了

3、okhttp使用教程

4、okhttp github








                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: