歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中POST方式發送HTTP請求

Android中POST方式發送HTTP請求

日期:2017/3/1 9:25:58   编辑:Linux編程

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