你的位置:首页 > 操作系统

[操作系统]android中Post方式发送HTTP请求


Post方式比Get方式要复杂一点,因为该方式需要将请求的参数放在http请求的正文中,所以需要构造请求体。

步骤:

1.构造URL

URL url = new URL(PATH);

2.设置连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();   connection.setConnectTimeout(3000);   connection.setDoInput(true);//表示从服务器获取数据   connection.setDoOutput(true);//表示向服务器写数据   //获得上传信息的字节大小以及长度      connection.setRequestMethod("POST");   //是否使用缓存   connection.setUseCaches(false);   //表示设置请求体的类型是文本类型   connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");      connection.setRequestProperty("Content-Length", String.valueOf(mydata.length));   connection.connect();  

  3.写入请求正文

Map<String, String> params = new HashMap<String, String>();params.put("username", "lili");params.put("password", "123");StringBuffer buffer = new StringBuffer();try {//把请求的主体写入正文!! if(params != null&&!params.isEmpty()){//迭代器 for(Map.Entry<String, String> entry : params.entrySet()){ buffer.append(entry.getKey()).append("="). append(URLEncoder.encode(entry.getValue(),encode)). append("&"); }}//  System.out.println(buffer.toString()); //删除最后一个字符&,多了一个;主体设置完毕 buffer.deleteCharAt(buffer.length()-1); byte[] mydata = buffer.toString().getBytes(); //获得输出流,向服务器输出数据   OutputStream outputStream = connection.getOutputStream();      outputStream.write(mydata,0,mydata.length);

  4.读取返回数据,关闭连接

//通常叫做内存流,写在内存中的ByteArrayOutputStream outputStream = new ByteArrayOutputStream();byte[] data = new byte[1024];int len = 0;String result = "";if(inputStream != null){try {while((len = inputStream.read(data))!=-1){data.toString();outputStream.write(data, 0, len);}//result是在服务器端设置的doPost函数中的result = new String(outputStream.toByteArray(),encode);outputStream.flush();

  下面上代码:一个简单的Demo访问一个自建的Servlet:

package com.http.post;  import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map;  public class HttpUtils {    private static String PATH = "http://172.24.87.47:8088/myhttp/servlet/LoginAction";   private static URL url;   public HttpUtils() {     // TODO Auto-generated constructor stub   }    static{     try {       url = new URL(PATH);     } catch (MalformedURLException e) {       // TODO Auto-generated catch block       e.printStackTrace();     }   }   /**   * @param params 填写的url的参数   * @param encode 字节编码   * @return   */   public static String sendPostMessage(Map<String, String> params,String encode){     StringBuffer buffer = new StringBuffer();     try {//把请求的主体写入正文!!        if(params != null&&!params.isEmpty()){         //迭代器        for(Map.Entry<String, String> entry : params.entrySet()){          buffer.append(entry.getKey()).append("=").          append(URLEncoder.encode(entry.getValue(),encode)).          append("&");        }       } //      System.out.println(buffer.toString());        //删除最后一个字符&,多了一个;主体设置完毕        buffer.deleteCharAt(buffer.length()-1);        byte[] mydata = buffer.toString().getBytes();         HttpURLConnection connection = (HttpURLConnection) url.openConnection();        connection.setConnectTimeout(3000);        connection.setDoInput(true);//表示从服务器获取数据        connection.setDoOutput(true);//表示向服务器写数据        //获得上传信息的字节大小以及长度                connection.setRequestMethod("POST");        //是否使用缓存        connection.setUseCaches(false);        //表示设置请求体的类型是文本类型        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");                connection.setRequestProperty("Content-Length", String.valueOf(mydata.length));        connection.connect();  //连接,不写也可以。。??有待了解               //获得输出流,向服务器输出数据        OutputStream outputStream = connection.getOutputStream();           outputStream.write(mydata,0,mydata.length);           //获得服务器响应的结果和状态码        int responseCode = connection.getResponseCode();         if(responseCode == HttpURLConnection.HTTP_OK){          return changeInputeStream(connection.getInputStream(),encode);                  }     } catch (UnsupportedEncodingException e) {       // TODO Auto-generated catch block       e.printStackTrace();     } catch (IOException e) {       // TODO Auto-generated catch block       e.printStackTrace();     }          return "";   }   /**   * 将一个输入流转换成字符串   * @param inputStream   * @param encode   * @return   */   private static String changeInputeStream(InputStream inputStream,String encode) {     //通常叫做内存流,写在内存中的     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();     byte[] data = new byte[1024];     int len = 0;     String result = "";     if(inputStream != null){       try {         while((len = inputStream.read(data))!=-1){           data.toString();                      outputStream.write(data, 0, len);         }         //result是在服务器端设置的doPost函数中的         result = new String(outputStream.toByteArray(),encode);         outputStream.flush();       } catch (IOException e) {         // TODO Auto-generated catch block         e.printStackTrace();       }     }     return result;   }    public static void main(String[] arsg){     Map<String, String> params = new HashMap<String, String>();     params.put("username", "lili");     params.put("password", "123");     String result = sendPostMessage(params,"utf-8");     System.out.println("result->"+result);   } } 

  下边是服务端的Servlet代码:

package com.login.manager;  import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter;  import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;  public class LoginAction extends HttpServlet {    /**   * Constructor of the object.   */   public LoginAction() {     super();   }    /**   * Destruction of the servlet. <br>   */   public void destroy() {     super.destroy(); // Just puts "destroy" string in log     // Put your code here   }    public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {      this.doPost(request, response);      }    /**   * The doPost method of the servlet. <br>   *   * This method is called when a form has its tag value method equals to post.   *    * @param request the request send by the client to the server   * @param response the response send by the server to the client   * @throws ServletException if an error occurred   * @throws IOException if an error occurred   */   public void doPost(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {      response.setContentType("text/html;charset=utf-8");     request.setCharacterEncoding("utf-8");     response.setCharacterEncoding("utf-8");     PrintWriter out = response.getWriter();     String username = request.getParameter("username"); //传过来的内容是:password=123&username=lili    System.out.println("username:"+username);     String pswd = request.getParameter("password");     System.out.println("password:"+pswd);     if(username.equals("张三")&&pswd.equals("123")){       //表示服务器端返回的结果       out.print("login is success!!!!");     }else{       out.print("login is fail!!!");     }        out.flush();     out.close();   }    /**   * Initialization of the servlet. <br>   *   * @throws ServletException if an error occurs   */   public void init() throws ServletException {     // Put your code here   }  } 

  服务端代码使用servlet搭建的。。。

这是运行结果:

服务端的:

 在服务端接收的内容是:password=123&username=lili  被它解析啦。。