Android中POST方式发送HTTP请求

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

在Android用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 = ":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搭建的。。。

这是运行结果:

服务端的:

Android中POST方式发送HTTP请求

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f2c37220726e9fbfd9c45b9c4fa3b3bb.html