妈妈再也不用担心我不会okhttp的服务器和客户端的传值了
来源:互联网 发布:远距离网络传输 编辑:程序博客网 时间:2024/04/29 06:34
本人用的服务器是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() {// 异步执行@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
- 妈妈再也不用担心我不会okhttp的服务器和客户端的传值了
- 从此妈妈再也不用担心我的View冲突了
- 妈妈再也不用担心我不会webpack了
- 用c++快速创建多个文件夹!妈妈再也不用担心我的手指了!!!
- Swift详解之四-------妈妈再也不用担心我的闭包了
- 原来指针可以这么来理解,妈妈再也不用担心我的编程了
- 玩物涨智:妈妈再也不用担心我的学习了
- 妈妈再也不用担心我的macbook发烫了计划2.0Beta
- 商场优惠活动——妈妈再也不用担心这类题我不会了!
- Oracle中表空间和数据文件的理解--so easy,妈妈再也不用担心我的学习!
- 妈妈再也不用担心我手贱删文件了呢
- 妈妈再也不用担心我使用git了
- 妈妈再也不用担心我喝汽水了。
- 妈妈再也不用担心我的博客访问量了(一个可以刷博客访问量的小程序java)
- 神器PEview 妈妈再也不用担心我看dll和lib等库文件了
- 神器PEview 妈妈再也不用担心我看dll和lib等库文件了
- 超全的一线互联网公司内部面试题库,有了它,妈妈再也不用担心我进不了大公司了!
- 第二章:git远程仓库(有了远程仓库,妈妈再也不用担心我的硬盘了)
- MTK平台下Battery驱动分析及充电流程
- 2015蓝桥杯决赛 关联账户(并查集,水)
- Android sdk 无法下载问题
- 3145 汉诺塔游戏
- [leetcode]221. Maximal Square
- 妈妈再也不用担心我不会okhttp的服务器和客户端的传值了
- MYSQL5.7版本sql_mode=only_full_group_by问题
- 面试题3
- 可以播放gif图片的imageview
- leetcode101. Symmetric Tree
- 螺旋矩阵-由内向外旋转
- iTOP-4412 触摸屏勘误
- 双绞线
- 一个简单的网页爬虫