android中Post方式发送HTTP请求
2015-08-17 16:15
387 查看
Post方式比Get方式要复杂一点,因为该方式需要将请求的参数放在http请求的正文中,所以需要构造请求体。
步骤:
1.构造URL
3.写入请求正文
4.读取返回数据,关闭连接
下面上代码:一个简单的Demo访问一个自建的Servlet:
下边是服务端的Servlet代码:
服务端代码使用servlet搭建的。。。
这是运行结果:
服务端的:
在服务端接收的内容是:password=123&username=lili 被它解析啦。。
步骤:
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-使用HttpClient框架提交数据(get/post)
- 关闭防火墙解决httpclient.execute长时间停滞
- hdu 4274 2012长春赛区网络赛 树形dp ***
- linux网络设备驱动学习
- java HttpSessionListener监听在线人数操作session
- TCP/IP详解 卷I:协议 のARP
- Android动画学习Demo(3) 关于Property Animation的TimeInpolator和TypeEvaluatorhttp://blog.csdn.net/linmiansheng
- WEB服务器、应用程序服务器、HTTP服务器区别
- 38 网络相关函数(六)——live555源码阅读(四)网络
- 如何在ubuntu 15.04服务器上配置SNMPv3?
- Tcp 数据对象传输接口对象设计
- LINUX使用FTP搭建网络版YUM源
- c 语言实现httpclient端的post,get, delete
- ZOJ 3818 Pretty Poem (2014年牡丹江赛区网络赛J题)
- 设计管理员表;webservice用于网络安全的高端内提供服务的
- 黑马程序员--java基础--网络编程TCP传输
- HTTP 状态消息和六种请求方式
- Alamofire-Swift Networking网络库
- asp.net mvc 5.0 借助路由规则实现*.aspx与HttpHandler交互
- android 缓存网络音频播放