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

本人用的服务器是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() {// 异步执行

			@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() {

		// 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() {
		// 异步执行
		@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



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/itrunner123/article/details/72580514