妈妈再也不用担心我不会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 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中的配置:
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
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
相关文章推荐
- [FreeGPU]colab用法详解 妈妈再也不用担心我们买不起显卡租不起服务器啦
- 神器PEview 妈妈再也不用担心我看dll和lib等库文件了
- 高精度题目JAVA写法基础篇,妈妈再也不用担心我的高精度
- 第二章:git远程仓库(有了远程仓库,妈妈再也不用担心我的硬盘了)
- 仿ios各种对话框实现,妈妈再也不用担心了
- 从此妈妈再也不用担心我的View冲突了
- 妈妈再也不用担心我的方法数超过65535啦
- 有了 tldr,妈妈再也不用担心我记不住命令了
- 下载iOS开源代码,妈妈再也不用担心我找不到iOS开源代码了
- JDK自带工具一览表。妈妈再也不用担心你到处去下载小软件了~~
- 妈妈再也不用担心我使用git了
- 美国不限流量G口服务器从此不用担心流量问题
- 有了这个公式,妈妈再也不用担心我计算日期差了
- 妈妈再也不用担心我找不到文件了---find
- 妈妈再也不用担心我的macbook发烫了计划2.0Beta
- Android 客户端 okhttp3 与服务器之间的双向验证
- VS2008 使用 occi 连接 Oracle 服务器- 不用安装客户端
- 用c++快速创建多个文件夹!妈妈再也不用担心我的手指了!!!
- 深层次两张图解经典6大排序与6大基础数据结构——学完这些,妈妈再也不用担心我的排序算法与数据结构,学习笔记大放送
- 原来指针可以这么来理解,妈妈再也不用担心我的编程了