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  被它解析啦。。

时间: 2024-11-03 11:37:48

android中Post方式发送HTTP请求的相关文章

Android中使用HttpClient发送Get请求

这里要指定编码,不然服务器接收到的会是乱码的.

Android中的几种网络请求方式详解

http://blog.csdn.net/zuolongsnail/article/details/6373051 Android应用中使用AsyncHttpClient来异步网络数据 http://blog.csdn.net/sdvch/article/details/13615605 Android中的几种网络请求方式详解,布布扣,bubuko.com

Android面向HTTP协议发送get请求

/** * 採用get请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到的数据 */ public static String getRequest(String username, String password) { try { String path = "http://172.22.64.156:8080/0001AndroidWebService/LoginServlet?use

android使用apache httpclient发送post请求

package com.liuc; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.ht

Android面向HTTP协议发送post请求

/** * 采用post请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到的数据 */ public static String postRequest(String username, String password) { try { String path = "http://172.22.64.156:8080/0001AndroidWebService/LoginServlet&q

python通过get方式,post方式发送http请求和接收http响应-urllib urllib2

python通过get方式,post方式发送http请求和接收http响应-- import urllib模块,urllib2模块, httplib模块 http://blog.163.com/[email protected]/blog/static/132229655201231085444250/ 测试用CGI,名字为test.py,放在apache的cgi-bin目录下:#!/usr/bin/pythonimport cgidef main():     print "Content-t

android 中调用接口发送短信

android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: Java代码   //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getDefault(); List<String> divideContents = smsManager.divideMessage(content); for (String text : divideContents) { smsManager.sendTextMessage(&

通过在jquery中添加函数发送ajax请求来加载数据库数据,以json的格式发送到页面

通过在jquery中添加函数发送ajax请求来加载数据库数据,以json的格式发送到页面 从数据库中查询仓库信息,显示在下拉菜单中: 首先,引入js插件,这里使用jquery-1.8.3.js <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.8.3.js"></script> 当页面加载完成后,就应该发送ajax请求到数据库,

Android中BindService方式使用的理解

Android中BindService方式使用的理解 - 唯一小神 - 博客园 最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现. BindService和Started Service都是Service,有什么地方不一样呢: 1. Started Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行[onCreate()-? >onS