歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中POST方式發送HTTP請求

Android中POST方式比Get方式要復雜一點,因為該方式需要將請求的參數放在http請求的正文中,所以需要構造請求體。

在Android用Get方式發送http請求  http://www.linuxidc.com/Linux/2015-08/121970.htm

步驟:

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

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved