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

来源:互联网 发布:远距离网络传输 编辑:程序博客网 时间:2024/04/29 06:34

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

1、异步get的传值:

客户端:

  1. public void doGet() throws IOException {//该方法只需要在客户端的onCreate方法中调用即可。
  2. // 1、拿到okhttpclient对象
  3. //2、 构造request,在此设置get或post方法,同时向服务器传递一些参数
  4. Request.Builder builder = new Request.Builder();
  5. Request request = builder.url("www.baidu.com").build();//这里直接请求百度服务器,客户端可以通过 String res = response.body().string();直接返回其源码
  6. executeRequst(request);
  7. }
  8. private void executeRequst(Request request){
  9. //3、将request封装为call,是单个请求的执行者
  10. Call call = okHttpClient.newCall(request);
  11. //4、执行call(异步和同步)
  12. // call.execute();
  13. call.enqueue(new Callback() {//异步执行
  14. @Override
  15. public void onResponse(Response response) throws IOException {
  16. String res = response.body().string();
  17. getActivity().runOnUiThread(new Runnable() {
  18. @Override
  19. public void run() {
  20. mTv.setText(res);//动态设置textView的值
  21. }
  22. });
  23. }
  24. @Override
  25. public void onFailure(Request arg1, IOException e) {
  26. String json = e.getMessage();  
  27. }
  28. });
  29. }

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() {// 异步执行@Overridepublic void onResponse(Response response) throws IOException {if (response.isSuccessful()) {final String res = response.body().string();System.out.println("获取从服务器的数据" + res);runOnUiThread(new Runnable() {@Overridepublic void run() {}});} }@Overridepublic 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() {// create方法:参数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() {// 异步执行@Overridepublic void onResponse(Response response) throws IOException {if (response.isSuccessful()) {final String res = response.body().string();System.out.println("获取从服务器的数据" + res);runOnUiThread(new Runnable() {@Overridepublic void run() {}});} else {throw new IOException("RegisterActivity have unexpect codeee" + response);}}@Overridepublic 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



 
阅读全文
2 0
原创粉丝点击