Android学习笔记46:使用Post方式提交数据
三种POST和GET的提交方式
三种POST和GET的提交方式向服务器提交数据有两种方式,post和get。
两者的区别主要有三点,安全性、长度限制、数据结构。
其中get请求安全性相比较而言较差,数据长度受浏览器地址栏限制,没有方法体。
两种都是较为重要的数据提交方式。
现简单介绍一下三种post和get的提交方式。
无论是哪种方法实现post和get,get 的访问路径都要携带数据,而post提交是把数据放在方法体中。
普通方法实现get/post提交:严格遵照Http协议进行数据传输。
在安卓开发环境下,由于主线程不能进行网络访问,因此需要在开启一个子线程向服务器提交数据。
为了更加直观的观察数据,可以在程序屏幕上显示服务器反馈信息。
又由于子线程无法更改UI界面,因此需要引入Hnndler代理器。
实现get/post提交基本步骤就是,获取URL路径,根据路径得到Http连接,用HttpURLConnection对象设置相关的http配置信息、提交方式以及获取反馈码。
当响应码为200时表示提交成功,可以通过HttpURLConnection以流的形式获取反馈信息。
普通GRT提交方式:public void load(View view){final String qq = et_qq.getText().toString().trim();final String pwd = et_pwd.getText().toString().trim();if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();return;}final String path = "http://192.168.1.114:8080/qqload/qqload?qq=" + qq+ "&pwd=" + pwd;new Thread() {public void run() {try {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setReadTimeout(5000);int code = conn.getResponseCode();if (code == 200) {InputStream is = conn.getInputStream();String result = StreamTools.ReadStream(is);Message msg = Message.obtain();msg.what = SUCCESS;msg.obj = result;handler.sendMessage(msg);} else {Message msg = Message.obtain();msg.what = ERROR1;handler.sendMessage(msg);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Message msg = Message.obtain();msg.what = ERROR2;handler.sendMessage(msg);}}}.start();}普通POST提交方式:复制代码public void load(View view){final String qq = et_qq.getText().toString().trim();final String pwd = et_pwd.getText().toString().trim();if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();return;}final String path = "http://192.168.1.114:8080/qqload/qqload";new Thread() {public void run() {try {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setReadTimeout(5000);conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");String data = "qq="+URLEncoder.encode(qq,"utf-8")+"&pwd=" + URLEncoder.encode(pwd,"utf-8");conn.setRequestProperty("Content-Length",String.valueOf(data.length()));etDoOutput(true);conn.getOutputStream().write(data.getBytes());int code = conn.getResponseCode();if (code == 200) {InputStream is = conn.getInputStream();String result = StreamTools.ReadStream(is);Message msg = Message.obtain();msg.what = SUCCESS;msg.obj = result;handler.sendMessage(msg);} else {Message msg = Message.obtain();msg.what = ERROR1;handler.sendMessage(msg);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Message msg = Message.obtain();msg.what = ERROR2;handler.sendMessage(msg);}}}.start();}复制代码用httpclien实现get/post提交的只需要一下几个步骤:1. 创建HttpClient对象,实现打开浏览器的功能HttpClient client = new DefaultHttpClient();2. 输入地址或者数据,用到HttpGet()或HttpPost(),传入要访问的路径,得到HttpGet或HttpPost对象。
post方法
post方法首先,我们来看post方法的基本使用方法。
在使用post方法时,我们需要向服务器提交一些数据,这些数据通常包含在请求的消息体中。
相比之下,get方法是将数据包含在URL中,而post方法则将数据放在消息体中,这使得post方法更适合提交大量数据或敏感数据,因为URL中的数据会被保存在浏览器历史记录中,而消息体中的数据不会。
另外,post方法没有长度限制,可以提交任意长度的数据。
在实际开发中,post方法通常用于提交表单数据。
当用户填写表单并点击提交按钮时,表单数据会被封装成一个post请求,然后发送给服务器。
服务器收到请求后,可以根据提交的数据执行相应的操作,比如创建新的用户、发布新的文章、更新数据等。
由于post方法可以提交大量数据,因此在处理文件上传时也经常会使用post方法。
除了提交表单数据外,post方法还可以用于创建新资源。
在RESTful API中,post方法通常用于创建新的资源,比如创建新的文章、创建新的订单等。
通过post方法提交数据,服务器可以根据提交的数据创建新的资源,并返回相应的结果给客户端。
另外,post方法还可以用于提交JSON数据。
在现代的Web开发中,前后端通常采用JSON格式进行数据交互,而post方法可以很方便地提交JSON数据。
客户端将数据封装成JSON格式,然后通过post方法发送给服务器,服务器收到数据后可以解析JSON并进行相应的处理。
总的来说,post方法是一种非常常用的HTTP请求方法,它适合提交大量数据、敏感数据、表单数据、文件上传等操作。
在实际开发中,我们经常会用到post方法来实现各种功能,因此熟练掌握post方法的使用方法是非常重要的。
希望本文对post方法的理解和应用有所帮助,如果您对post方法还有其他疑问或者需要进一步的了解,请随时与我们联系,我们将竭诚为您服务。
Android使用post方式上传图片到服务器的方法
Android使⽤post⽅式上传图⽚到服务器的⽅法本⽂实例讲述了Android使⽤post⽅式上传图⽚到服务器的⽅法。
分享给⼤家供⼤家参考,具体如下:/*** 上传⽂件到服务器类** @author tom*/public class UploadUtil {private static final String TAG = "uploadFile";private static final int TIME_OUT = 10 * 1000; // 超时时间private static final String CHARSET = "utf-8"; // 设置编码/*** Android上传⽂件到服务端** @param file 需要上传的⽂件* @param RequestURL 请求的rul* @return 返回响应的内容*/public static String uploadFile(File file, String RequestURL) {String result = null;String BOUNDARY = UUID.randomUUID().toString(); // 边界标识随机⽣成String PREFIX = "--", LINE_END = "\r\n";String CONTENT_TYPE = "multipart/form-data"; // 内容类型try {URL url = new URL(RequestURL);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(TIME_OUT);conn.setConnectTimeout(TIME_OUT);conn.setDoInput(true); // 允许输⼊流conn.setDoOutput(true); // 允许输出流conn.setUseCaches(false); // 不允许使⽤缓存conn.setRequestMethod("POST"); // 请求⽅式conn.setRequestProperty("Charset", CHARSET); // 设置编码conn.setRequestProperty("connection", "keep-alive");conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);if (file != null) {/*** 当⽂件不为空,把⽂件包装并且上传*/DataOutputStream dos = new DataOutputStream(conn.getOutputStream());StringBuffer sb = new StringBuffer();sb.append(PREFIX);sb.append(BOUNDARY);sb.append(LINE_END);/*** 这⾥重点注意: name⾥⾯的值为服务端需要key 只有这个key 才可以得到对应的⽂件* filename是⽂件的名字,包含后缀名的⽐如:abc.png*/sb.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""+ file.getName() + "\"" + LINE_END);sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);sb.append(LINE_END);dos.write(sb.toString().getBytes());InputStream is = new FileInputStream(file);byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {dos.write(bytes, 0, len);}is.close();dos.write(LINE_END.getBytes());byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();dos.write(end_data);dos.flush();/*** 获取响应码 200=成功当响应成功,获取响应的流*/int res = conn.getResponseCode();Log.e(TAG, "response code:" + res);// if(res==200)// {Log.e(TAG, "request success");InputStream input = conn.getInputStream();StringBuffer sb1 = new StringBuffer();int ss;while ((ss = input.read()) != -1) {sb1.append((char) ss);}result = sb1.toString();Log.e(TAG, "result : " + result);// }// else{// Log.e(TAG, "request error");// }}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}/*** 通过拼接的⽅式构造请求内容,实现参数传输以及⽂件传输** @param url Service net address* @param params text content* @param files pictures* @return String result of Service response* @throws IOException*/public static String post(String url, Map<String, String> params, Map<String, File> files)throws IOException {String BOUNDARY = java.util.UUID.randomUUID().toString();String PREFIX = "--", LINEND = "\r\n";String MULTIPART_FROM_DATA = "multipart/form-data";String CHARSET = "UTF-8";URL uri = new URL(url);HttpURLConnection conn = (HttpURLConnection) uri.openConnection();conn.setReadTimeout(10 * 1000); // 缓存的最长时间conn.setDoInput(true);// 允许输⼊conn.setDoOutput(true);// 允许输出conn.setUseCaches(false); // 不允许使⽤缓存conn.setRequestMethod("POST");conn.setRequestProperty("connection", "keep-alive");conn.setRequestProperty("Charsert", "UTF-8");conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); // ⾸先组拼⽂本类型的参数StringBuilder sb = new StringBuilder();for (Map.Entry<String, String> entry : params.entrySet()) {sb.append(PREFIX);sb.append(BOUNDARY);sb.append(LINEND);sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);sb.append("Content-Transfer-Encoding: 8bit" + LINEND);sb.append(LINEND);sb.append(entry.getValue());sb.append(LINEND);}DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());outStream.write(sb.toString().getBytes());// 发送⽂件数据if (files != null)for (Map.Entry<String, File> file : files.entrySet()) {StringBuilder sb1 = new StringBuilder();sb1.append(PREFIX);sb1.append(BOUNDARY);sb1.append(LINEND);sb1.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""+ file.getValue().getName() + "\"" + LINEND);sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);sb1.append(LINEND);outStream.write(sb1.toString().getBytes());InputStream is = new FileInputStream(file.getValue());byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {outStream.write(buffer, 0, len);}is.close();outStream.write(LINEND.getBytes());}// 请求结束标志byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();outStream.write(end_data);outStream.flush();// 得到响应码int res = conn.getResponseCode();InputStream in = conn.getInputStream();StringBuilder sb2 = new StringBuilder();if (res == 200) {int ch;while ((ch = in.read()) != -1) {sb2.append((char) ch);}}outStream.close();conn.disconnect();return sb2.toString();}}⽰例调⽤第⼆种⽅式上传:final Map<String, String> params = new HashMap<String, String>();params.put("send_userId", String.valueOf(id));params.put("send_email", address);params.put("send_name", name);params.put("receive_email", emails);final Map<String, File> files = new HashMap<String, File>();files.put("uploadfile", file);final String request = UploadUtil.post(requestURL, params, files);更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。
POST提交数据常见的四种方式
POST提交数据常见的四种⽅式规定的 HTTP 请求⽅法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这⼏种。
其中 POST ⼀般⽤来向服务端提交数据,本⽂主要讨论 POST 提交数据的⼏种⽅式。
我们知道,HTTP 协议是以 ASCII 码传输,建⽴在 TCP/IP 协议之上的应⽤层规范。
规范把 HTTP 请求分为三个部分:状态⾏、请求头、消息主体。
类似于下⾯这样:<method> <request-URL> <version><headers><entity-body>协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使⽤什么编码⽅式。
实际上,开发者完全可以⾃⼰决定消息主体的格式,只要最后发送的 HTTP 请求满⾜上⾯的格式就可以。
但是,数据发送出去,还要服务端解析成功才有意义。
⼀般服务端语⾔如 php、python 等,以及它们的 framework,都内置了⾃动解析常见数据格式的功能。
服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是⽤何种⽅式编码,再对主体进⾏解析。
所以说到 POST 提交数据⽅案,包含了 Content-Type 和消息主体编码⽅式两部分。
下⾯就正式开始介绍它们。
application/x-www-form-urlencoded这应该是最常见的 POST 提交数据的⽅式了。
浏览器的原⽣ form 表单,如果不设置 enctype 属性,那么最终就会以application/x-www-form-urlencoded ⽅式提交数据。
请求类似于下⾯这样(⽆关的请求头在本⽂中都省略掉了):POST HTTP/1.1Content-Type: application/x-www-form-urlencoded;charset=utf-8title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3⾸先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的⽅式进⾏编码,key 和 val 都进⾏了 URL 转码。
post方法
post方法Post方法是一种常用的HTTP请求方法,用于向服务器提交数据。
在网络开发中,我们经常会用到Post方法来实现用户注册、登录、提交表单数据等功能。
本文将详细介绍Post方法的使用及相关注意事项。
首先,我们来了解一下Post方法的基本原理。
Post方法是将数据放在请求的消息体中,而不是像Get方法那样放在URL中。
这意味着Post方法可以提交大量数据,而且相对安全,因为用户输入的数据不会暴露在URL中。
另外,Post方法也支持多种数据格式,如表单数据、JSON数据、XML数据等,灵活性较高。
在实际应用中,我们可以通过以下步骤来使用Post方法:1. 创建HTTP请求,首先,我们需要使用相应的工具或编程语言创建一个HTTP请求,指定请求的URL和方法为Post。
2. 设置请求头部,在发送Post请求之前,我们需要设置请求头部,包括Content-Type、Content-Length等信息,以确保服务器能正确解析请求数据。
3. 设置请求消息体,接下来,我们需要将要提交的数据放入请求的消息体中,可以是表单数据、JSON数据等格式。
4. 发送请求并处理响应,最后,我们发送Post请求,并等待服务器返回响应。
在收到响应后,我们需要根据业务需求对响应数据进行处理,如解析数据、显示提示信息等。
在使用Post方法时,还需要注意以下几点:1. 安全性,Post方法相对于Get方法来说更安全,但仍然需要注意数据的加密和防止跨站脚本攻击等安全问题。
2. 数据格式,根据实际需求选择合适的数据格式,如表单数据、JSON数据等,以确保数据能够正确传输和解析。
3. 请求头部设置,正确设置请求头部信息对于Post请求的成功与否至关重要,需要确保头部信息的准确性和完整性。
4. 响应处理,在收到服务器的响应后,需要根据业务需求对响应数据进行合理的处理,如错误处理、数据展示等。
总之,Post方法是一种非常常用且灵活的HTTP请求方法,能够满足我们在网络开发中对数据提交的各种需求。
安卓使用post提交数据并获得方服务端的响应
本文档提供了安卓如何使用post向服务端提交数据,并获得服务端的响应的方法,有服务端的详细代码,有客户端的详细代码,并且仔细说明的过程和代码的作用。
希望对大家有很好的帮助在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。
在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。
POST与GET的不同之处在于POST的参数不是放在URL字符串里面,而是放在HTTP请求数据中。
本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并将服务器的响应结果显示在Android客户端。
1.服务器端的准备为了完成该实例,我们需要在服务器端做以下准备工作:(1)我们需要在MyEclipse中创建一个Web工程,用来模拟服务器端的Web服务,这里,我将该工程命名为了“myhttp”。
(2)修改该工程的“index.jsp”文件,添加两个输入框和一个提交按钮,作为该Web工程的显示页面。
运行Tomcat,在浏览器中访问该Web工程,可以看到如图1所示的界面。
图1 Web工程的显示页面(3)在该Web工程中,创建一个继承自HttpServlet的LoginAction类,并实现其中的doPost()方法,用来响应图1所示页面的用户操作。
具体实现如下:1public void doPost(HttpServletRequest request, HttpServletResponse response)2throws ServletException, IOException {34response.setContentType("text/html;charset=utf-8");5 request.setCharacterEncoding("utf-8");6 response.setCharacterEncoding("utf-8");7 PrintWriter out = response.getWriter();89 String username =request.getParameter("username");10 String password =request.getParameter("password");1112//判断用户名密码是否正确13if(username.equals("admin") &&password.equals("123")) {14 out.print("Login succeeded!");15 }else {16 out.print("Login failed!");17 }1819 out.flush();20 out.close();21 }由上述代码可以看出,当我们在图1所示的页面输入用户名“admin”,密码“123”时,点击提交按钮,会得到“Login succeeded!”的提示信息,如图2所示。
post方法
post方法首先,我们来了解post方法的基本原理。
当使用post方法向服务器提交数据时,数据会被包含在请求的消息体中,而不是像get方法那样直接附在URL后面。
这意味着post方法可以用来提交大量数据,而且相对于get方法更安全,因为提交的数据不会暴露在URL中。
另外,post方法没有长度限制,可以用来上传文件等大容量数据。
在实际应用中,我们通常会通过HTML的表单来使用post方法。
在表单的`<form>`标签中设置`method="post"`即可指定使用post方法提交数据。
例如:```html。
<form action="/submit" method="post">。
<input type="text" name="username">。
<input type="password" name="password">。
<button type="submit">提交</button>。
</form>。
```。
在上面的例子中,当用户填写完用户名和密码后点击提交按钮,表单数据将以post请求的方式发送到服务器的`/submit`路径。
除了表单提交外,post方法还可以通过AJAX等技术在不刷新页面的情况下向服务器提交数据。
这为Web应用的交互体验提供了更多可能性。
在使用post方法时,我们需要注意以下几点:1. 安全性,post方法相对于get方法更安全,但仍然需要注意在传输过程中对数据进行加密处理,以防止敏感信息泄露。
2. 数据大小,post方法没有大小限制,但服务器和客户端都有可能对post请求的大小进行限制,因此在上传大量数据时需要注意相关限制。
Android向Web提交参数的4种方式总结
Android 向Web 提交参数的4种方式总结 2013年06月27日 10:13供稿中心: 互联网运营部摘要:Android 向Web 提交参数的4种方式总结,第一种:基于http 协议通过get 方式提交参数...第一种:基于http 协议通过get 方式提交参数123456789 101112131415161718publicstaticString get_save(String name, String phone) { /** * 出现乱码原因有2个 提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码 * tomatCAT 服务器默认采用iso859-1编码,解决方法:把PHP 页面保存为UTF-8格式 */ String path ="http://192.168.0.117/testxml/web.php "; Map<String, String> params =newHashMap<String, String>(); try{params.put("name", URLEncoder.encode(name,"UTF-8")); params.put("phone", phone); returnsendgetrequest(path, params); }catch(Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return"提交失败"; }get_save ()1.对多个参数的封装1 2345 6 7 8 9 10 11 12 13 14 151617181920 21 privatestaticString sendgetrequest(String path, Map<String, String> params)throwsException {//path="http://192.168.0.117/testxml/web.php?name=xx&phone=xx "; StringBuilder url =newStringBuilder(path);url.append("?");for(Map.Entry<String, String> entry : params.entrySet()) { url.append(entry.getKey()).append("=");url.append(entry.getValue()).append("&");}url.deleteCharAt(url.length() -1);URL url1 =newURL(url.toString());HttpURLConnection conn = (HttpURLConnection) url1.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");if(conn.getResponseCode() ==200) {InputStream instream = conn.getInputStream();ByteArrayOutputStream outstream =newByteArrayOutputStream();byte[] buffer =newbyte[1024];22 23 24 25 26 27 28 29 while(instream.read(buffer) != -1) {outstream.write(buffer);}instream.close();returnoutstream.toString().trim();}return"连接失败";}sendgetrequest2.提交参数第二种:基于http 协议通过post 方式提交参数1.对多个参数封装1 2 3 45 6 7 8 9 10 publicstaticString post_save(String name, String phone) {/*** 出现乱码原因有2个 提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码* tomatCAT 服务器默认采用iso859-1编码,解决方法:把PHP 页面保存为UTF-8格式*/String path ="http://192.168.0.117/testxml/web.php "; Map<String, String> params =newHashMap<String, String>(); try{params.put("name", URLEncoder.encode(name,"UTF-8"));11 12 13 14 15 16 17 18 params.put("phone", phone);returnsendpostrequest(path, params);}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return"提交失败";}post_save2.提交参数123456789 10 11 12 13 privatestaticString sendpostrequest(String path, Map<String, String> params)throwsException { // name=xx&phone=xx StringBuilder data =newStringBuilder(); if(params !=null&& !params.isEmpty()) { for(Map.Entry<String, String> entry : params.entrySet()) { data.append(entry.getKey()).append("="); data.append(entry.getValue()).append("&"); }data.deleteCharAt(data.length() -1);}byte[] entiy = data.toString().getBytes();// 生成实体数据 URL url =newURL(path);14 15161718192021 22 23 24 25 26 272829303132333435HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(5000);conn.setRequestMethod("POST");conn.setDoOutput(true);// 允许对外输出数据conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length",String.valueOf(entiy.length));OutputStream outstream = conn.getOutputStream();outstream.write(entiy);if(conn.getResponseCode() ==200) {InputStream instream = conn.getInputStream(); ByteArrayOutputStreambyteoutstream =newByteArrayOutputStream();byte[] buffer =newbyte[1024];while(instream.read(buffer) != -1) {byteoutstream.write(buffer);}instream.close();returnbyteoutstream.toString().trim();}return"提交失败";}sendpostrequest ()第三种:基于httpclient 类通过post 方式提交参数1.对多个参数的封装123 4 56789101112131415161718publicstaticString httpclient_postsave(String name, String phone) { /*** 出现乱码原因有2个 提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码* tomatCAT 服务器默认采用iso859-1编码,解决方法:把PHP 页面保存为UTF-8格式*/String path ="http://192.168.0.117/testxml/web.php ";Map<String, String> params =newHashMap<String, String>(); try{params.put("name", name);params.put("phone", phone);returnsendhttpclient_postrequest(path, params);}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return"提交失败";}httpclient_postsave2.提交参数1 privatestaticString sendhttpclient_postrequest(String2 3 4 56 7 8 9 1011121314151617 18 19 20 21 22 23 path,Map<String, String> params) {List<NameValuePair> pairs =newArrayList<NameValuePair>(); for(Map.Entry<String, String> entry : params.entrySet()) {pairs.add(newBasicNameValuePair(entry.getKey(), entry.getValue()));}try{UrlEncodedFormEntity entity=new UrlEncodedFormEntity(pairs,"UTF-8");HttpPost httpost=newHttpPost(path);httpost.setEntity(entity);HttpClient client=newDefaultHttpClient();HttpResponse response= client.execute(httpost);if(response.getStatusLine().getStatusCode()==200){returnEntityUtils.toString(response.getEntity(),"utf-8");}}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}returnnull;}sendhttpclient_postrequest ()第四种方式:基于httpclient 通过get 提交参数1.多个参数的封装123 4 56789101112131415161718publicstaticString httpclient_getsave(String name, String phone) { /*** 出现乱码原因有2个 提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码* tomatCAT 服务器默认采用iso859-1编码,解决方法:把PHP 页面保存为UTF-8格式*/String path ="http://192.168.0.117/testxml/web.php "; Map<String, String> params =newHashMap<String, String>(); try{params.put("name", name);params.put("phone", phone);returnsendhttpclient_getrequest(path, params);}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return"提交失败";}httpclient_getsave2.提交参数1 23 4 56 7 8 9 10 11 12 13 14 151617181920212223privatestaticStringsendhttpclient_getrequest(String path,Map<String, String> map_params) {List<BasicNameValuePair> params =newArrayList<BasicNameValuePair>();for(Map.Entry<String, String> entry : map_params.entrySet()) {params.add(newBasicNameValuePair(entry.getKey(), entry.getValue()));}String param=URLEncodedUtils.format(params,"UTF-8"); HttpGet getmethod=newHttpGet(path+"?"+param);HttpClient httpclient=newDefaultHttpClient();try{HttpResponse response=httpclient.execute(getmethod); if(response.getStatusLine().getStatusCode()==200){returnEntityUtils.toString(response.getEntity(),"utf-8"); }}catch(ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch(IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}returnnull;}sendhttpclient_getrequest ()4.种方式完整测试案例源码1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 packagecaicai.web;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.EditText;importandroid.widget.TextView;publicclassCai_webActivityextendsActivity {TextView success;String name;String phone;EditText name_view;EditText phone_view;publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.main);name_view=(EditText) findViewById();20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 phone_view=(EditText) findViewById(R.id.phone); success=(TextView) findViewById(R.id.success);}publicvoidget_save(View v){name=name_view.getText().toString();phone=phone_view.getText().toString();success.setText(service.get_save(name,phone)); }publicvoidpost_save(View v){name=name_view.getText().toString();phone=phone_view.getText().toString();success.setText(service.post_save(name,phone));}publicvoidhttpclient_postsave(View v){name=name_view.getText().toString();phone=phone_view.getText().toString();success.setText(service.httpclient_postsave(name,phone)); }publicvoidhttpclient_getsave(View v){name=name_view.getText().toString();phone=phone_view.getText().toString();success.setText(service.httpclient_getsave(name,phone)); }43 44 45 46 47}Cai_webActivity.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 packagecaicai.web;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;.HttpURLConnection;.URL;.URLEncoder;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.apache.http.HttpResponse;ValuePair;importorg.apache.http.client.ClientProtocolException;importorg.apache.http.client.HttpClient;importorg.apache.http.client.entity.UrlEncodedFormEntity;19 20 21 22 23 24 25 26 27 28 29 30 3132 33 34 35 36 37 38 39 40 41 importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.client.utils.URLEncodedUtils;importorg.apache.http.impl.client.DefaultHttpClient;importorg.apache.http.message.BasicNameValuePair;importorg.apache.http.util.EntityUtils;publicclassservice {publicstaticString get_save(String name, String phone) { /*** 出现乱码原因有2个 提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码* tomatCAT 服务器默认采用iso859-1编码,解决方法:把PHP 页面保存为UTF-8格式*/String path ="http://192.168.0.117/testxml/web.php "; Map<String, String> params =newHashMap<String, String>(); try{params.put("name", URLEncoder.encode(name,"UTF-8")); params.put("phone", phone);returnsendgetrequest(path, params);}catch(Exception e) {// TODO Auto-generated catch block42 43 44 45 46 47 48495051 52 53 54 55 56 57 58 59 60 61626364 e.printStackTrace();}return"提交失败";}privatestaticString sendgetrequest(String path, Map<String, String> params)throwsException {//path="http://192.168.0.117/testxml/web.php?name=xx&phone=xx "; StringBuilder url =newStringBuilder(path);url.append("?");for(Map.Entry<String, String> entry : params.entrySet()) { url.append(entry.getKey()).append("=");url.append(entry.getValue()).append("&");}url.deleteCharAt(url.length() -1);URL url1 =newURL(url.toString());HttpURLConnection conn =(HttpURLConnection) url1.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");if(conn.getResponseCode() ==200) {65 66 676869707172737475767778798081 82 8384858687InputStream instream = conn.getInputStream();ByteArrayOutputStream outstream =newByteArrayOutputStream();byte[] buffer =newbyte[1024];while(instream.read(buffer) != -1) {outstream.write(buffer);}instream.close();returnoutstream.toString().trim();}return"连接失败";}publicstaticString post_save(String name, String phone) { /*** 出现乱码原因有2个 提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码* tomatCAT 服务器默认采用iso859-1编码,解决方法:把PHP 页面保存为UTF-8格式*/String path ="http://192.168.0.117/testxml/web.php "; Map<String, String> params =newHashMap<String, String>(); try{88 89 90 91 92 93 94 95 96 97 98 99 100101 102 103104 105 106 10 params.put("name", URLEncoder.encode(name,"UTF-8")); params.put("phone", phone);returnsendpostrequest(path, params);}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return"提交失败";}privatestaticString sendpostrequest(String path,Map<String, String> params)throwsException {// name=xx&phone=xxStringBuilder data =newStringBuilder();if(params !=null&& !params.isEmpty()) {for(Map.Entry<String,String> entry : params.entrySet()) {data.append(entry.getKey()).append("=");data.append(entry.getValue()).append("&");}data.deleteCharAt(data.length() -1);}byte[] entiy = data.toString().getBytes();// 生成实体数据 URL url =newURL(path);710 810 911 011 111 211 311 411 511 611 711 811 912 012 112 HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(5000);conn.setRequestMethod("POST");conn.setDoOutput(true);// 允许对外输出数据conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length",String.valueOf(entiy.length));OutputStream outstream = conn.getOutputStream();outstream.write(entiy);if(conn.getResponseCode() ==200) {InputStream instream = conn.getInputStream();ByteArrayOutputStream byteoutstream =newByteArrayOutputStream();byte[] buffer =newbyte[1024];while(instream.read(buffer) != -1) {byteoutstream.write(buffer);}instream.close();returnbyteoutstream.toString().trim();}return"提交失败";}212 312 412 512 612 712 812 913 013 113 213 313 413 513 613 publicstaticString httpclient_postsave(String name, String phone) {/*** 出现乱码原因有2个提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码* tomatCAT服务器默认采用iso859-1编码,解决方法:把PHP页面保存为UTF-8格式*/String path ="http://192.168.0.117/testxml/web.php";Map<String, String> params =newHashMap<String, String>();try{params.put("name", name);params.put("phone", phone);returnsendhttpclient_postrequest(path, params);}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return"提交失败";}privatestaticString sendhttpclient_postrequest(String path,Map<String, String> params) {List<NameValuePair> pairs =newArrayList<NameValuePair>();713 813 914 014 114 214 314 414 514 614 714 814 915 015 115 for(Map.Entry<String, String> entry : params.entrySet()) {pairs.add(newBasicNameValuePair(entry.getKey(), entry.getValue()));}try{UrlEncodedFormEntity entity=new UrlEncodedFormEntity(pairs,"UTF-8");HttpPost httpost=newHttpPost(path);httpost.setEntity(entity);HttpClient client=newDefaultHttpClient();HttpResponse response= client.execute(httpost);if(response.getStatusLine().getStatusCode()==200){returnEntityUtils.toString(response.getEntity(),"utf-8");}}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}returnnull;}215 315 415 515 615 715 815 916 016 116 216 316 416 516 616 publicstaticString httpclient_getsave(String name, String phone) {/*** 出现乱码原因有2个提交参数没有对中文编码,解决方法:使用URLEncoder.encode(xx,xx)对要提交的汉字转码* tomatCAT服务器默认采用iso859-1编码,解决方法:把PHP页面保存为UTF-8格式*/String path ="http://192.168.0.117/testxml/web.php";Map<String, String> params =newHashMap<String, String>();try{params.put("name", name);params.put("phone", phone);returnsendhttpclient_getrequest(path, params);}catch(Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return"提交失败";}privatestaticString sendhttpclient_getrequest(String path,Map<String, String> map_params) {List<BasicNameValuePair> params716 816 917 017 117 217 317 417 517 617 717 817 918 018 118=newArrayList<BasicNameValuePair>();for(Map.Entry<String, String> entry : map_params.entrySet()) {params.add(newBasicNameValuePair(entry.getKey(), entry.getValue()));}String param=URLEncodedUtils.format(params,"UTF-8");HttpGet getmethod=newHttpGet(path+"?"+param);HttpClient httpclient=newDefaultHttpClient();try{HttpResponse response=httpclient.execute(getmethod);if(response.getStatusLine().getStatusCode()==200){ returnEntityUtils.toString(response.getEntity(),"utf-8"); }}catch(ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch(IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}returnnull;}218 318 418 518 618 718 818 919 019 119 219 319 419 519 619 }service.java19 819 920 020 120 220 320 420 520 620 720 820 921 021 121 2123456789 1011121314151617181920212223<?xml version="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="/apk/res/android " android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="fill_parent"android:layout_height="wrap_content" android:text="姓名:"/> <EditText android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="电话:"/> <EditText24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 android:id="@+id/phone"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="get 提交"android:onClick="get_save"android:layout_marginRight="30px"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="post 提交"android:onClick="post_save"android:layout_marginRight="30px"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Httpclient_post 提交"android:onClick="httpclient_postsave"android:layout_marginRight="30px"/>47 48 49 50 51 52 53 54 55 56 57 58 <Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Httpclient_get 提交"android:onClick="httpclient_getsave"/><TextViewandroid:id="@+id/success"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>main.xml123456789 10111213141516171819 20 21 22 23 <?xml version="1.0"encoding="utf-8"?> <manifest xmlns:android="/apk/res/android " package="caicai.web" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8"/> <uses-permission android:name="android.permission.INTERNET"/><application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:label="@string/app_name" android:name=".Cai_webActivity"> <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="UNCHER"/></intent-filter></activity></application>24 25 </manifest>AndroidManifest.xml。
post方法
post方法Post方法。
在网络编程中,post方法是一种常用的数据传输方式。
它通常用于向服务器提交数据,比如用户登录、注册、提交表单等操作。
相较于get方法,post方法更安全、更灵活,可以传输更大量的数据,并且不会在URL中显示传输的数据,保护用户隐私。
本文将介绍post方法的基本原理、使用方法和注意事项。
首先,我们来了解post方法的基本原理。
在HTTP协议中,post方法是通过请求体来传输数据的,而get方法是通过URL参数传输数据的。
当用户提交表单或进行其他操作时,浏览器会将表单中的数据封装在请求体中,然后通过post方法将数据发送给服务器。
服务器接收到数据后,进行相应的处理,并返回处理结果给客户端。
这种方式可以保护用户的隐私,因为数据不会直接暴露在URL中,同时也可以传输更大量的数据,适用于各种复杂的业务需求。
接下来,我们来看post方法的使用方法。
在前端开发中,可以使用form表单来发起post请求,也可以使用XMLHttpRequest对象或fetch API来手动构造post请求。
在form表单中,设置method属性为post,然后在表单中添加需要提交的数据即可。
在JavaScript中,可以使用XMLHttpRequest对象来发送post请求,也可以使用fetch API来发送post请求。
使用fetch API时,可以通过设置请求的method为post,headers为Content-Type: application/json等方式来发送post请求。
在服务器端,可以通过处理post请求体中的数据来实现相应的业务逻辑。
最后,我们需要注意一些post方法的使用注意事项。
首先,post方法不会在URL中显示传输的数据,但是数据会暴露在请求体中,所以仍然需要注意数据的安全性。
其次,post方法传输的数据量没有限制,但是服务器和网络环境会对数据大小进行限制,需要根据实际情况进行调整。
详解Android中使用OkHttp发送HTTP的post请求的方法
详解Android中使⽤OkHttp发送HTTP的post请求的⽅法HTTP POST 和 PUT 请求可以包含要提交的内容。
只需要在创建 Request 对象时,通过 post 和 put ⽅法来指定要提交的内容即可。
HTTP POST 请求的基本⽰例:public class PostString {public static void main(String[] args) throws IOException {OkHttpClient client = new OkHttpClient();MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");String postBody = "Hello World";Request request = new Request.Builder().url("").post(RequestBody.create(MEDIA_TYPE_TEXT, postBody)).build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) {throw new IOException("服务器端错误: " + response);}System.out.println(response.body().string());}}以 String 类型提交内容只适⽤于内容⽐较⼩的情况。
当请求内容较⼤时,应该使⽤流来提交。
Post⽅式提交流以流的⽅式POST提交请求体。
请求体的内容由流写⼊产⽣。
这个例⼦是流直接写⼊ Okio 的BufferedSink。
你的程序可能会使⽤ OutputStream ,你可以使⽤ BufferedSink.outputStream() 来获取。
AndroidOkHttpPost上传文件并且携带参数实例详解
AndroidOkHttpPost上传⽂件并且携带参数实例详解Android OkHttp Post上传⽂件并且携带参数这⾥整理⼀下 OkHttp 的 post 在上传⽂件的同时,也要携带请求参数的⽅法。
使⽤ OkHttp 版本如下:compile 'com.squareup.okhttp3:okhttp:3.4.1'代码如下:protected void post_file(final String url, final Map<String, Object> map, File file) {OkHttpClient client = new OkHttpClient();// form 表单形式上传MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);if(file != null){// MediaType.parse() ⾥⾯是上传的⽂件类型。
RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);String filename = file.getName();// 参数分别为,请求key ,⽂件名称, RequestBodyrequestBody.addFormDataPart("headImage", file.getName(), body);}if (map != null) {// map ⾥⾯是请求中所需要的 key 和 valuefor (Map.Entry entry : map.entrySet()) {requestBody.addFormDataPart(valueOf(entry.getKey()), valueOf(entry.getValue()));}}Request request = new Request.Builder().url("请求地址").post(requestBody.build()).tag(context).build();// readTimeout("请求超时时间" , 时间单位);client.newBuilder().readTimeout(5000, LISECONDS).build().newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.i("lfq" ,"onFailure");}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String str = response.body().string();Log.i("lfq", response.message() + " , body " + str);} else {Log.i("lfq" ,response.message() + " error : body " + response.body().string());}}});}这⾥说明⼀点,就是 MultipartBody.Builder 的 addFormDataPart ⽅法,是对于之前的 addPart ⽅法做了⼀个封装,所以,不需要再去配置 Header 之类的。
黑马程序员安卓教程:Post方式提交数据到服务器
Post方式提交数据到服务器我们已经了解Get方式请求数据到服务器的编写(参考:Get方式提交数据到服务器),下面我们来接着了解Post请求数据的方式。
1.抓取Post数据流Post方式请求数据的原理是怎样的?与Get方式请求数据的过程有什么区别呢?下面我们通过httpwatch来抓取post方式请求数据的过程。
在web项目的jsp页面中接着编写post请求表单,效果如图1-1所示:图1-1所示图1-1对应的jsp页面代码如例1-1:例1-1jsp代码<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><br>Get方式提交数据<form action="LoginServlet" method="get">用户名:<input name="username" type="text"><br>密码:<input name="password" type="password"><br><input type="submit"></form><br>Post方式提交数据<form action="LoginServlet" method="post">用户名:<input name="username" type="text"><br>密码:<input name="password" type="password"><br><input type="submit"></form></body></html>在IE浏览器中访问该登录界面,当以post方式点击“提交查询内容”按钮时,抓取数据流如图1-2所示请求内容长度请求类型请求内容本身图1-2所示2.Get请求和Post请求的区别通过httpwatch抓取Post数据流(本例图1-2)和Get数据流(参考Get方式提交数据流图1-5)我们可以得出如下几个结论:●Get向特定的资源发出请求,Post向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
android 网络编程 HttpGet类和HttpPost类使用详解
android 网络编程 HttpGet类和HttpPost类使用详解内容来源于《人人都玩开心网》一书虽然在登录系统中使用了Web Service与服务端进行交互。
但是在传递大量的数量时,Web Service显得有些笨拙。
在本节将介绍移动电子相册中使用的另外一种与数据库交互的方法。
直接发送HTTP GET或POST请求。
这就要用到HttpGet、HttpPost以及HttpURLConnection这些类。
15.3.1 HttpGet类和HttpPost类本节将介绍Android SDK集成的Apache HttpClient模块。
要注意的是,这里的Apache HttpClient模块是HttpClient 4.0(org.apache.http.*),而不是Jakarta Commons HttpClient 3.x(mons.httpclient.*)。
在HttpClient模块中用到了两个重要的类:HttpGet和HttpPost。
这两个类分别用来提交HTTP GET和HTTP POST请求。
为了测试本节的例子,需要先编写一个Servlet程序,用来接收HTTP GET和HTTP POST请求。
读者也可以使用其他服务端的资源来测试本节的例子。
假设192.168.17.81是本机的IP,客户端可以通过如下的URL来访问服务端的资源:http://192.168.17.81:8080/querybooks/QueryServlet?bookname=开发在这里bookname是QueryServlet的请求参数,表示图书名,通过该参数来查询图书信息。
现在我们要通过HttpGet和HttpPost类向QueryServlet提交请求信息,并将返回结果显示在TextView组件中。
无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源。
1.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet 或HttpPost对象。
安卓GET与POST网络请求的三种方式
安卓GET与POST⽹络请求的三种⽅式我们的应⽤常常要联⽹取得⽹络上的数据,然后进⾏解析,必须要先取到数据之后才能进⾏下⼀步的业务。
故⽹络请求是常⽤的操作,下⾯我介绍常⽤的三种⽅式,第⼀是⽐较原始的⽅法,使⽤HttpURLConnection,第⼆是Volley框架,第三是xutils3框架。
1.HttpURLConnection⽅法这是基于⽹络通信HTTP协议的⽹络请求,其它两种框架也是基于HTTP协议的。
HTTP协议是⼀款基于短连接的协议,每次交互完毕后连接断开,⽽HTTP请求⼜分为GET和POST两种⽅式,GET请求⽐较简单,只需要在⽹址后⾯⽤?拼接请求的资源路径,如百度图⽚输⼊动漫关键字的地址/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8%E6%BC%AB可以看到index?后⾯跟了很多&连接的项⽬,这个&就是代表了⼀个个搜索的条件,⽽最后⼀个word=%E5%8A%A8%E6%BC%AB⼜是什么意思呢就是输⼊的两个字”动漫”,这就是UTF-8编码后的字节,中⽂⼀个字符会编成三个字节,这是⽤16进制表⽰了⼀个字节。
从中也可以看到GET请求的⼀个限制,那就是不能传递中⽂,也不适合⼤数据量的数据提交。
⽽POST则就没这个限制,且安全性也⽐GET请求⾼,总结就是简单的⽹络请求⽤GET,⽐较复杂的要与服务器与交互的就⽤POST请求。
Android之用HTTP的get,post,HttpClient三种方式向service提交文本数据
客户端代码示例:1/**2 * HTTP请求3 * @author kesenhoo4 *5 */6public class HttpRequest7{8public static boolean sendXML(String path, String xml)throws Exception9 {10byte[] data = xml.getBytes();11 URL url = new URL(path);12 HttpURLConnection conn = (HttpURLConnection)url.openConnection();13 conn.setRequestMethod("POST");14 conn.setConnectTimeout(5 * 1000);15//如果通过post提交数据,必须设置允许对外输出数据16 conn.setDoOutput(true);17 conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");18 conn.setRequestProperty("Content-Length",String.valueOf(data.length));19 OutputStream outStream = conn.getOutputStream();20 outStream.write(data);21 outStream.flush();22 outStream.close();23if(conn.getResponseCode()==200)24 {25return true;26 }27return false;28 }29/**30 * 通过get方式提交参数给服务器31 * @param path32 * @param params33 * @param enc34 * @return35 * @throws Exception36 */37public static boolean sendGetRequest(String path, Map<String, String> params, String enc) throws Exception38 {39//构造如下形式的字符串,这里的字符串依情况不同40// ?method=save&title=435435435&timelength=89&41//使用StringBuilder对象42 StringBuilder sb = new StringBuilder(path);43 sb.append('?');44//迭代Map45for(Map.Entry<String, String> entry : params.entrySet())46 {47 sb.append(entry.getKey()).append('=')48 .append(URLEncoder.encode(entry.getValue(), enc)).append('&');49 }50 sb.deleteCharAt(sb.length()-1);51//打开链接52 URL url = new URL(sb.toString());53 HttpURLConnection conn = (HttpURLConnection)url.openConnection();54 conn.setRequestMethod("GET");55 conn.setConnectTimeout(5 * 1000);56//如果请求响应码是200,则表示成功57if(conn.getResponseCode()==200)58 {59return true;60 }61return false;62 }6364/**65 * 通过Post方式提交参数给服务器66 * @param path67 * @param params68 * @param enc69 * @return70 * @throws Exception71 */72public static boolean sendPostRequest(String path, Map<String, String> params, String enc) throws Exception73 {74//需要构造的字符串形式如下:75// title=dsfdsf&timelength=23&method=save76 StringBuilder sb = new StringBuilder();77//如果参数不为空78if(params!=null && !params.isEmpty())79 {80for(Map.Entry<String, String> entry : params.entrySet())81 {82//Post方式提交参数的话,不能省略内容类型与长度83 sb.append(entry.getKey()).append('=')84 .append(URLEncoder.encode(entry.getValue(),enc)).append('&');85 }86 sb.deleteCharAt(sb.length()-1);87 }88//得到实体的二进制数据89byte[] entitydata = sb.toString().getBytes();90 URL url = new URL(path);91 HttpURLConnection conn = (HttpURLConnection)url.openConnection();92 conn.setRequestMethod("POST");93 conn.setConnectTimeout(5 * 1000);94//如果通过post提交数据,必须设置允许对外输出数据95 conn.setDoOutput(true);96//这里只设置内容类型与内容长度的头字段97//内容类型Content-Type: application/x-www-form-urlencoded98//内容长度Content-Length: 3899 conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");100 conn.setRequestProperty("Content-Length",String.valueOf(entitydata.length));101 OutputStream outStream = conn.getOutputStream();102//把实体数据写入是输出流103 outStream.write(entitydata);104//内存中的数据刷入105 outStream.flush();106 outStream.close();107//如果请求响应码是200,则表示成功108if(conn.getResponseCode()==200)109 {110return true;111 }112return false;113 }114115/**116 * 在遇上HTTPS安全模式或者操作cookie的时候使用HTTPclient会方便很多117 * 使用HTTPClient(开源项目)向服务器提交参数118 * @param path119 * @param params120 * @param enc121 * @return122 * @throws Exception123 */124public static boolean sendRequestFromHttpClient(String path, Map<String, String> params, String enc) throws Exception125 {126//需要把参数放到NameValuePair127 List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();128if(params!=null && !params.isEmpty())129 {130for(Map.Entry<String, String> entry : params.entrySet())131 {132 paramPairs.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));133 }134 }135//对请求参数进行编码,得到实体数据136 UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, enc);137//构造一个请求路径138 HttpPost post = new HttpPost(path);139//设置请求实体140 post.setEntity(entitydata);141//浏览器对象142 DefaultHttpClient client = new DefaultHttpClient();143//执行post请求144 HttpResponse response = client.execute(post);145//从状态行中获取状态码,判断响应码是否符合要求146if(response.getStatusLine().getStatusCode()==200)147 {148return true;149 }150return false;151 }152}。
post请求传递参数的方法
post请求传递参数的方法1. 使用表单提交最常见的方法是使用HTML表单来提交参数。
我们可以在HTML中创建一个包含需要传递的参数的表单,并将其提交给服务器。
以下是一个简单的示例:```<form action="/submit" method="post"><input type="text" name="username" placeholder="Username"><input type="password" name="password" placeholder="Password"><button type="submit">Submit</button></form>```在这个例子中,我们创建了一个表单,其中包含了一个用户名和密码的输入框。
当用户点击提交按钮时,表单会被提交到服务器的"/submit"端点,并且参数会被包含在请求体中。
2. 使用AJAX请求除了使用表单提交外,我们还可以使用JavaScript中的AJAX(Asynchronous JavaScript and XML)来发送POST请求。
这种方法可以在不刷新页面的情况下向服务器发送数据。
以下是一个使用AJAX的示例:```<script>var xhr = new XMLHttpRequest();xhr.open('POST', '/submit', true);xhr.setRequestHeader('Content-Type', 'application/json');xhr.onreadystatechange = function () {if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {console.log(xhr.responseText);}};var data = {username: 'john_doe',password: 'pass123'};xhr.send(JSON.stringify(data));</script>```在这个例子中,我们使用JavaScript创建了一个XMLHttpRequest对象,然后以POST方法将数据发送到服务器的"/submit"端点。
android软件开发http-post方法简单实现
android软件开发http-post方法简单实现本代码演示在Android 如何使用POST 来提交数据Java代码1packagecom.hl;23importjava.io.BufferedReader;4importjava.io.IOException;5importjava.io.InputStream;6importjava.io.InputStreamReader;7importjava.util.ArrayList;8importjava.util.HashMap;9importjava.util.Iterator;10importjava.util.Map;11importjava.util.Set;1213importorg.apache.http.HttpEntity;14importorg.apache.http.HttpResponse;15importorg.apache.http.client.entity.UrlEncodedFormEntity;16importorg.apache.http.client.methods.HttpPost;17importorg.apache.http.impl.client.DefaultHttpClient;18importorg.apache.http.message.BasicNameValuePair;1920importandroid.app.Activity;21importandroid.os.Bundle;22importandroid.view.View;23importandroid.view.View.OnClickListener;24importandroid.widget.Button;25importandroid.widget.EditText;26importandroid.widget.TextView;2728publicclassSimplePOSTextendsActivity{29privateTextViewshow;30privateEditTexttxt;31privateButtonbtn;3233@Override34publicvoidonCreate(BundlesavedInstanceState){35super.onCreate(savedInstanceState);36setContentView(yout.main);37show=(TextView)findViewById(R.id.show);38txt=(EditText)findViewById(R.id.txt);39btn=(Button)findViewById(R.id.btn);40btn.setOnClickListener(newOnClickListener(){4142@Override43publicvoidonClick(Viewv){44dopost(txt.getText().toString());4546}47});48}4950privatevoiddopost(Stringval){51//封装数据52Map<String,String>parmas=newHashMap<String,String>();53parmas.put("name",val);5455DefaultHttpClientclient=newDefaultHttpClient();//http客户端56HttpPosthttpPost=newHttpPost("/test/post.php");5758ArrayList<BasicNameValuePair>pairs=newArrayList<BasicNameValuePair>(); 59if(parmas!=null){60Set<String>keys=parmas.keySet();61for(Iterator<String>i=keys.iterator();i.hasNext();){62Stringkey=(String)i.next();63pairs.add(newBasicNameValuePair(key,parmas.get(key)));64}65}6667try{68UrlEncodedFormEntityp_entity=newUrlEncodedFormEntity(pairs,"utf-8");69/*70*将POST数据放入HTTP请求71*/72httpPost.setEntity(p_entity);73/*74*发出实际的HTTPPOST请求75*/76HttpResponseresponse=client.execute(httpPost);77HttpEntityentity=response.getEntity();78InputStreamcontent=entity.getContent();79StringreturnConnection=convertStreamToString(content);80show.setText(returnConnection);81}catch(IllegalStateExceptione){82 e.printStackTrace();83}catch(IOExceptione){84 e.printStackTrace();85}8687}8889privateStringconvertStreamToString(InputStreamis){90BufferedReaderreader=newBufferedReader(newInputStreamReader(is)); 91StringBuildersb=newStringBuilder();92Stringline=null;93try{94while((line=reader.readLine())!=null){95sb.append(line);96}97}catch(IOExceptione){98 e.printStackTrace();99}finally{100try{101is.close();102}catch(IOExceptione){103e.printStackTrace();104}105}106returnsb.toString();107}108}。
android采用post方式获取服务器数据
Toast.makeText(context, HTTP_903, Toast.LENGTH_LONG).show(); break; default: Toast.makeText(context, HTTP_UNKONW, Toast.LENGTH_LONG).show(); break; } if(proDialog!=null) proDialog.dismiss(); }
2.获取服务器端返回http状态的提示及处理方法
根据服务器返回的状态提示相应的信息的类,可以根据实际需要自定义提示状态,例如登录,注册等提示。
Http_Status_Tips.java源码:
view plain copy to clipboard print ?
package com.httppost.main;
1.发送http请求,并传递相应的参数;
2.获取http返回的状态,根据返回的状态,如404错误,500错误,连接超时,请求异常等,并在界面提示相关状 态;
3.web服务器端封装数据并返回一定格式的数据对象,例如封装json对象;
4.http状态返回正常,取出正确的参数并解析,如解析json对象;
5.解析服务器端返回的数据后显示在android相应的控件或存储本地数据,提示操作完成等。
因为习惯使用以上的5个步骤,于是写了一个相对完善的一个处理方法。以下主要是使用post方式获取数据并解析封 装的过程,封装json主要有两种封装方法:一种是单个json封装,另一种是带数组的json封装;解析json对应相应的 方法。服务器端封装数据的语言采用php封装。get方式请求的方法过程类似。
HttpPostRequest .java源码:
view plain copy to clipboard print ? package com.httppost.main;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android学习笔记46:使用Post方式提交数据在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。
在HTTP通信中使用最多的就是GET和POST了,GET 请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。
POST与GET的不同之处在于POST 的参数不是放在URL字符串里面,而是放在HTTP请求数据中。
本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并将服务器的响应结果显示在Android客户端。
1.服务器端的准备为了完成该实例,我们需要在服务器端做以下准备工作:(1)我们需要在MyEclipse中创建一个Web工程,用来模拟服务器端的Web服务,这里,我将该工程命名为了“myhttp”。
(2)修改该工程的“index.jsp”文件,添加两个输入框和一个提交按钮,作为该Web工程的显示页面。
运行Tomcat,在浏览器中访问该Web工程,可以看到如图1所示的界面。
图1 Web工程的显示页面(3)在该Web工程中,创建一个继承自HttpServlet的LoginAction类,并实现其中的doPost()方法,用来响应图1所示页面的用户操作。
具体实现如下:1 public void doPost(HttpServletRequest request, HttpServletResponse response)2 throws ServletException, IOException {34response.setContentType("text/html;charset=utf-8");5 request.setCharacterEncoding("utf-8");6 response.setCharacterEncoding("utf-8");7 PrintWriter out = response.getWriter();89 String username =request.getParameter("username");10 String password =request.getParameter("password");1112 //判断用户名密码是否正确13 if(username.equals("admin") && password.equals("123")) {14 out.print("Login succeeded!");15 }else {16 out.print("Login failed!");17 }1819 out.flush();20 out.close();21 }由上述代码可以看出,当我们在图1所示的页面输入用户名“admin”,密码“123”时,点击提交按钮,会得到“Login succeeded!”的提示信息,如图2所示。
若用户名、密码错误,则会得到“Login failed!”的提示信息。
图2 登录成功界面至此,服务器端的准备工作就全部完成了。
2.客户端实现在Android客户端,我们需要完成的工作是:以POST方式发送用户名密码到上述服务器,并获得服务器的验证信息。
我们分以下几个步骤来完成。
2.1 UI界面在Android工程中,我们需要完成一个简单的UI界面,用来完成用户名密码的输入、发送POST请求、显示服务器的验证结果,完成后的界面如图3所示。
图3 客户端UI界面在MainActivity中,我们需要获取两个EditText控件的输入,“提交”按键的监听,以及服务器验证结果的TextView 内容显示。
具体实现代码如下:1 /*2 * Function : 点击事件响应3 * Author : 博客园-依旧淡然4 */5 public void onClick(View view) {6 switch(view.getId()) {7 case R.id.button_submit:8 String username =mEditText_userName.getText().toString();9 String password =mEditText_password.getText().toString();10 Map<String, String> params = new HashMap<String, String>();11 params.put("username", username);12 params.put("password", password);13mTextView_result.setText(HttpUtils.submitPostData(params, "utf-8"));14 break;15 }16 }2.2发送POST请求到服务器可以看到上述代码中,我们调用了HttpUtils类的静态方法submitPostData()完成了发送POST请求到服务器,并将该方法的返回值(服务器的响应结果)显示在了TextView控件中。
在HttpUtils类中,submitPostData()方法的具体实现如下:/** Function : 发送Post请求到服务器* Param : params请求体内容,encode编码格式* Author : 博客园-依旧淡然*/public static String submitPostData(Map<String,String> params, String encode) {byte[] data = getRequestData(params,encode).toString().getBytes();//获得请求体try {HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();httpURLConnection.setConnectTimeout(3000); //设置连接超时时间httpURLConnection.setDoInput(true);//打开输入流,以便从服务器获取数据httpURLConnection.setDoOutput(true);//打开输出流,以便向服务器提交数据httpURLConnection.setRequestMethod("POST"); //设置以Post方式提交数据httpURLConnection.setUseCaches(false);//使用Post方式不能使用缓存//设置请求体的类型是文本类型httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//设置请求体的长度httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length));//获得输出流,向服务器写入数据OutputStream outputStream = httpURLConnection.getOutputStream();outputStream.write(data);int response =httpURLConnection.getResponseCode(); //获得服务器的响应码if(response == HttpURLConnection.HTTP_OK) {InputStream inptStream = httpURLConnection.getInputStream();return dealResponseResult(inptStream);//处理服务器的响应结果}} catch (IOException e) {e.printStackTrace();}return "";}通过以上的代码可以看出,在该方法中,其实完成了3件事:(1)将用户名密码封装成请求体,这是通过调用getRequestData()方法来实现的(后面会讲到这个方法的具体实现)。
(2)设置HttpURLConnection对象的各种参数(其实是设置HTTP协议请求体的各项参数),然后通过httpURLConnection.getOutputStream()方法获得服务器输出流outputStream,再使用outputStream.write()方法将请求体内容发送给服务器。
(3)判断服务器的响应码,通过httpURLConnection.getInputStream()方法获得服务器的响应输入流,然后再调用dealResponseResult()方法处理服务器的响应结果。
2.3封装请求体使用POST请求时,POST的参数不是放在URL字符串里,而是放在HTTP请求数据中,所以我们需要对POST的参数进行封装。
针对该实例而言,我们发送的URL请求是:http://192.168.1.101:8080/myhttp/servlet/LoginAction,但是我们需要将POST的参数(也就是username和password)封装到该请求中,形成如下的形式:http://192.168.1.101:8080/myhttp/servlet/LoginAction?usernam e=admin&password=123。
我们该怎么做呢?如下的代码给出了一种实现的方案:1 /*2 * Function : 封装请求体信息3 * Param : params请求体内容,encode编码格式4 * Author : 博客园-依旧淡然5 */6 public static StringBuffergetRequestData(Map<String, String> params, String encode) {7 StringBuffer stringBuffer = new StringBuffer(); //存储封装好的请求体信息8 try {9 for(Map.Entry<String, String> entry : params.entrySet()) {10 stringBuffer.append(entry.getKey())11 .append("=")12 .append(URLEncoder.enc ode(entry.getValue(), encode))13 .append("&");14 }15stringBuffer.deleteCharAt(stringBuffer.length() - 1); //删除最后的一个"&"16 } catch (Exception e) {17 e.printStackTrace();18 }19 return stringBuffer;20 }2.4处理响应结果最后,我们再来看一看对服务器返回结果的处理是怎样的。