在保证服务器是正常状态时,将从Android模拟器上发送请求给服务端并接收服务端返回来的响应。
保证HttpServlet配置正常。可以通过在浏览器输入配置的地址,若能正常响应,那么在Android中去请求的话也是能正常响应的。
这里列举的Demo是在activity中有两个按钮,分别执行get请求和post请求的同时传递参数到服务端,并将服务端返回的信息显示到textview上。
客户端
一、get请求:
第一步:建立请求,连接服务器。
<span style="white-space:pre"> </span>String name = URLEncoder.encode("小红", "utf-8"); //中文输入先指定编码,不然会出现乱码 //get请求带参数的URL地址 http://192.168.1.112:8080/app/myweb?username=小红&password=abcd URL url = new URL(httpUrl+"?username="+name+"&password=abcd"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); //请求方式 conn.setConnectTimeout(15000); //设置连接超时 conn.setReadTimeout(10000); //设置读取超时 conn.connect(); //建立连接这里已经将参数加进去了。由于get请求的参数是直接加在URL地址之后,形式如同 http://192.168.1.112:8080/app/myweb?username=小红&password=abcd 问号后面就是携带的参数,中文参数需要先指定编码集,防止乱码。若没有参数则构造URL时就只需要协议地址。
第二步:服务器请求连接成功后,服务器接到参数,并作出响应,客户端只需从连接中的流中读出响应即可。
<span style="white-space:pre"> </span>InputStream in = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8")); //得到连接服务器的缓冲流 String line; StringBuilder sb = new StringBuilder(); while((line=br.readLine()) != null){ //从服务中读取请求返回的数据 sb.append(line); }
<span style="white-space:pre"> </span>/*get请求方式连接服务器 get请求传递参数在url后面加参数*/ public String getHttpDoget(String httpUrl){ try { String name = URLEncoder.encode("小红", "utf-8"); //中文输入先指定编码,不然会出现乱码 //get请求带参数的URL地址 http://192.168.1.112:8080/app/myweb?username=小红&password=abcd URL url = new URL(httpUrl+"?username="+name+"&password=abcd"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); //请求方式 conn.setConnectTimeout(15000); //设置连接超时 conn.setReadTimeout(10000); //设置读取超时 conn.connect(); //建立连接 InputStream in = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8")); //得到连接服务器的缓冲流 String line; StringBuilder sb = new StringBuilder(); while((line=br.readLine()) != null){ //从服务中读取请求返回的数据 sb.append(line); } return sb.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
<span style="white-space:pre"> </span>mConnecyBtn = (Button) findViewById(R.id.http_doget_btn); mConnecyBtn.setOnClickListener(new OnClickListener() { String httpUrl = "http://192.168.1.112:8080/app/myweb"; @Override public void onClick(View v) { new AsyncTask<String, Void, String>(){ @Override protected String doInBackground(String... params) { return getHttpDoget(params[0]); //调用请求响应方法 } protected void onPostExecute(String result) { mShowMsgTxt.setText(result); }; }.execute(httpUrl); } });
<span style="white-space:pre"> </span>URL url = new URL(httpUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); //请求方法 conn.setConnectTimeout(15000); //设置连接超时 conn.setReadTimeout(10000); //设置读取超时 conn.connect(); //建立连接 /*得到流向服务器传数据*/ OutputStream out = conn.getOutputStream(); PrintWriter pr = new PrintWriter(out); pr.print("username=小明&password=1234"); pr.flush();
<span style="white-space:pre"> </span>/*读取服务端数据*/ InputStream in = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8")); //得到连接服务器的缓冲流 String line; StringBuilder sb = new StringBuilder(); while((line=br.readLine()) != null){ //从服务中读取请求返回的数据 sb.append(line); }
post方式请求:
<span style="white-space:pre"> </span>/*post请求方式连接服务器,给服务器传递参数用流写入的方式*/ public String getHttpDopost(String httpUrl){ try { URL url = new URL(httpUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); //请求方法 conn.setConnectTimeout(15000); //设置连接超时 conn.setReadTimeout(10000); //设置读取超时 conn.connect(); //建立连接 /*得到流向服务器传数据*/ OutputStream out = conn.getOutputStream(); PrintWriter pr = new PrintWriter(out); pr.print("username=小明&password=1234"); pr.flush(); /*读取服务端数据*/ InputStream in = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8")); //得到连接服务器的缓冲流 String line; StringBuilder sb = new StringBuilder(); while((line=br.readLine()) != null){ //从服务中读取请求返回的数据 sb.append(line); } return sb.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
<span style="white-space:pre"> </span>mDopostBtn = (Button) findViewById(R.id.http_dopost_btn); mDopostBtn.setOnClickListener(new OnClickListener() { String http = "http://192.168.1.112:8080/app/myweb"; @Override public void onClick(View v) { new AsyncTask<String, Void, String>(){ @Override protected String doInBackground(String... params) { return getHttpDopost(params[0]); } protected void onPostExecute(String result) { mShowMsgTxt.setText(result); }; }.execute(http); } });
服务端:
最后看看服务端做了什么?服务端就是将客服端传来的参数获取到并且返回给客服端。
package CatServelet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class WebTestServelet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); //防止中文乱码 String name = req.getParameter("username"); //name = new String(name.getBytes("ISO-8859-1"),"UTF-8"); //解决乱码问题方式一 System.out.println(name); String password = req.getParameter("password"); resp.getWriter().print("password:" + password +"\n" +"username:"+name); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8");//设定请求编码 resp.setContentType("text/html;charset=utf-8"); //设定响应编码 防止中文乱码 String name = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(name); resp.getWriter().print("password:" + password +"\n" +"username:"+name); } }
乱码问题:首先肯定是统一所有编译器的编码集如UTF-8.
解决doGet请求乱码问题,这里设置了两处的编码集,一是在客户端请求服务端是传入的参数先指定编码集UTF-8。
String name = URLEncoder.encode("小红", "utf-8"); //中文输入先指定编码,不然会出现乱码
resp.setContentType("text/html;charset=utf-8"); //设置响应编码集 防止中文乱码
<span style="white-space:pre"> </span>req.setCharacterEncoding("UTF-8");//设定请求编码 resp.setContentType("text/html;charset=utf-8"); //设定响应编码 防止中文乱码
get请求和post请求的区别与比较:
Get请求只有一个流,参数附加在url后面,地址行显示要传送的信息,大小个数有严格的限制且只能是字符串。
Post请求的参数通过另外的流传递,不通过URL,所以可以很大,也可以传递二进制数据如文件。
就是参数传递方式,参数大小,参数类型有区别。
1、安全性:get请求参数显示在url地址后面,可能存在安全性。如密码,post请求可以解决这个问题。
2、服务器接收方式 服务器随机接收get请求的数据,一旦断电等意外原因,服务器不会知道信息是否传送完毕。而post请求是服务器先接收数据信息长度,在接受数据。
3、form运行方式。当form框里面的method为get时,执行doGet()方法。为post时,执行doPost()方法。
4、信息容量限制 get请求的参数信息有限制,post请求没有限制。
get请求乱码:
设定接受参数(客服端发送来的参数)编码集有两种方式,一是更改服务器配置文件,打开Tomcat--->conf目录下的server.xml文件
找到<Connector>标签在里面加一行URIEncoding="UTF-8"设定编码集。
另一种方式是得到参数后转码
<span style="white-space:pre"> </span>String name = req.getParameter("username"); name = new String(name.getBytes("ISO-8859-1"),"UTF-8"); //解决乱码问题方式一而响应请求(发送给客户端的参数)参数则用resp.setContentType("text/html;charset=utf-8"); //防止中文乱码
post请求乱码:
设定接受参数(客服端发送来的参数)编码集 req.setCharacterEncoding("UTF-8");//设定请求编码
响应请求(发送给客户端的参数)参数 resp.setContentType("text/html;charset=utf-8"); //设定响应编码 防止中文乱码
特别注意在doget()中req.setCharacterEncoding("UTF-8")来设置接收参数编码是没有作用的。还是需要name = new String(name.getBytes("ISO-8859-1"),"UTF-8"); 这种方式来转码。req.setCharacterEncoding("UTF-8")只在post()中有作用。
最后上图并贴上完整代码:
activity代码:主布局就只有两个按钮加一个textview控件。
package webview; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.sql.Connection; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import com.example.call.R; public class HttpServeletActivity extends Activity { private TextView mShowMsgTxt; private Button mConnecyBtn,mDopostBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.httpservelet_main_layout); mShowMsgTxt = (TextView) findViewById(R.id.http_text); mConnecyBtn = (Button) findViewById(R.id.http_doget_btn); mConnecyBtn.setOnClickListener(new OnClickListener() { String httpUrl = "http://192.168.1.112:8080/app/myweb"; @Override public void onClick(View v) { new AsyncTask<String, Void, String>(){ @Override protected String doInBackground(String... params) { return getHttpDoget(params[0]); } protected void onPostExecute(String result) { mShowMsgTxt.setText(result); }; }.execute(httpUrl); } }); mDopostBtn = (Button) findViewById(R.id.http_dopost_btn); mDopostBtn.setOnClickListener(new OnClickListener() { String http = "http://192.168.1.112:8080/app/myweb"; @Override public void onClick(View v) { new AsyncTask<String, Void, String>(){ @Override protected String doInBackground(String... params) { return getHttpDopost(params[0]); } protected void onPostExecute(String result) { mShowMsgTxt.setText(result); }; }.execute(http); } }); } /*post请求方式连接服务器,给服务器传递参数用流写入的方式*/ public String getHttpDopost(String httpUrl){ try { URL url = new URL(httpUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); //请求方法 conn.setConnectTimeout(15000); //设置连接超时 conn.setReadTimeout(10000); //设置读取超时 conn.connect(); //建立连接 /*得到流向服务器传数据*/ OutputStream out = conn.getOutputStream(); PrintWriter pr = new PrintWriter(out); pr.print("username=小明&password=1234"); pr.flush(); /*读取服务端数据*/ InputStream in = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8")); //得到连接服务器的缓冲流 String line; StringBuilder sb = new StringBuilder(); while((line=br.readLine()) != null){ //从服务中读取请求返回的数据 sb.append(line); } return sb.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } /*get请求方式连接服务器 get请求传递参数在url后面加参数*/ public String getHttpDoget(String httpUrl){ try { String name = URLEncoder.encode("小红", "utf-8"); //中文输入先指定编码,不然会出现乱码 //get请求带参数的URL地址 http://192.168.1.112:8080/app/myweb?username=小红&password=abcd URL url = new URL(httpUrl+"?username="+name+"&password=abcd"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); //请求方式 conn.setConnectTimeout(15000); //设置连接超时 conn.setReadTimeout(10000); //设置读取超时 conn.connect(); //建立连接 InputStream in = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8")); //得到连接服务器的缓冲流 String line; StringBuilder sb = new StringBuilder(); while((line=br.readLine()) != null){ //从服务中读取请求返回的数据 sb.append(line); } return sb.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
package CatServelet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class WebTestServelet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); //防止中文乱码 String name = req.getParameter("username"); //name = new String(name.getBytes("ISO-8859-1"),"UTF-8"); //解决乱码问题方式一 System.out.println(name); String password = req.getParameter("password"); resp.getWriter().print("password:" + password +"\n" +"username:"+name); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8");//设定请求编码 resp.setContentType("text/html;charset=utf-8"); //设定响应编码 防止中文乱码 String name = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(name); resp.getWriter().print("password:" + password +"\n" +"username:"+name); } }