Http学习之使用HttpURLConnection发送post和get请求 android

最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
在Java中可以使用HttpURLConnection发起这两种请求,了解此类,对于了解soap,和编写servlet的自动测试代码都有很大的帮助。
下面的代码简单描述了如何使用HttpURLConnection发起这两种请求,以及传递参数的方法:

Java代码  

  1. package com.android.httpurl;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import android.widget.TextView;
  11. import java.io.BufferedReader;
  12. import java.io.DataOutputStream;
  13. import java.io.InputStreamReader;
  14. import java.net.HttpURLConnection;
  15. import java.net.URL;
  16. import java.net.URLEncoder;
  17. public class HttpURLConActivity extends Activity {
  18. final String URL = "http://122.224.144.102:8080/publicback/httpurl?par=ylx";
  19. final String URL_Post = "http://122.224.144.102:8080/publicback/httpurl";
  20. private Button submit;
  21. private TextView result;
  22. String resultData="";
  23. URL url = null;
  24. HttpURLConnection urlConn = null;
  25. boolean isPost = true;
  26. /** Called when the activity is first created. */
  27. @Override
  28. public void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.main);
  31. submit = (Button) this.findViewById(R.id.submit);
  32. result = (TextView) this.findViewById(R.id.result);
  33. submit.setOnClickListener(new OnClickListener(){
  34. @Override
  35. public void onClick(View arg0) {
  36. // TODO Auto-generated method stub
  37. HttpURL();
  38. }
  39. });
  40. }
  41. private void HttpURLConnection_Get(){
  42. try{
  43. isPost = false;
  44. //通过openConnection 连接
  45. URL url = new java.net.URL(URL);
  46. urlConn=(HttpURLConnection)url.openConnection();
  47. //设置输入和输出流
  48. urlConn.setDoOutput(true);
  49. urlConn.setDoInput(true);
  50. //关闭连接
  51. urlConn.disconnect();
  52. }catch(Exception e){
  53. resultData = "连接超时";
  54. Message mg = Message.obtain();
  55. mg.obj = resultData;
  56. handler.sendMessage(mg);
  57. e.printStackTrace();
  58. }
  59. }
  60. private void HttpURLConnection_Post(){
  61. try{
  62. //通过openConnection 连接
  63. URL url = new java.net.URL(URL_Post);
  64. urlConn=(HttpURLConnection)url.openConnection();
  65. //设置输入和输出流
  66. urlConn.setDoOutput(true);
  67. urlConn.setDoInput(true);
  68. urlConn.setRequestMethod("POST");
  69. urlConn.setUseCaches(false);
  70. // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
  71. urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
  72. // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
  73. // 要注意的是connection.getOutputStream会隐含的进行connect。
  74. urlConn.connect();
  75. //DataOutputStream流
  76. DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
  77. //要上传的参数
  78. String content = "par=" + URLEncoder.encode("ylx_Post+中正", "UTF_8");
  79. //将要上传的内容写入流中
  80. out.writeBytes(content);
  81. //刷新、关闭
  82. out.flush();
  83. out.close();
  84. }catch(Exception e){
  85. resultData = "连接超时";
  86. Message mg = Message.obtain();
  87. mg.obj = resultData;
  88. handler.sendMessage(mg);
  89. e.printStackTrace();
  90. }
  91. }
  92. private void HttpURL() {
  93. new Thread(){
  94. public void run() {
  95. try{
  96. //Get方式
  97. //HttpURLConnection_Get();
  98. //Post方式
  99. HttpURLConnection_Post();
  100. InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
  101. BufferedReader buffer = new BufferedReader(in);
  102. String inputLine = null;
  103. while (((inputLine = buffer.readLine()) != null)){
  104. resultData += inputLine + "\n";
  105. }
  106. System.out.println(resultData);
  107. in.close();
  108. }catch(Exception e){
  109. resultData = "连接超时";
  110. e.printStackTrace();
  111. }finally{
  112. try{
  113. //关闭连接
  114. if(isPost)
  115. urlConn.disconnect();
  116. Message mg = Message.obtain();
  117. mg.obj = resultData;
  118. handler.sendMessage(mg);
  119. }catch(Exception e){
  120. e.printStackTrace();
  121. }
  122. }
  123. }
  124. }.start();
  125. }
  126. private Handler handler = new Handler() {
  127. @Override
  128. public void handleMessage(Message msg) {
  129. String m = (String) msg.obj;
  130. result.setText(m);
  131. }
  132. };
  133. }

HttpURLConnection.connect函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到HttpURLConnection.getInputStream()这个函数里面才正式发送出去。
对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。

http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content,在connect()函数里面,会根据HttpURLConnection对象的配置值生成http头,因此在调用connect函数之前,就必须把所有的配置准备好。

紧接着http头的是http请求的正文,正文的内容通过outputStream写入,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是在流关闭后,根据输入的内容生成http正文。

至此,http请求的东西已经准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。

时间: 2024-10-24 10:33:41

Http学习之使用HttpURLConnection发送post和get请求 android的相关文章

Http学习之使用HttpURLConnection发送post和get请求(2)

接上节Http学习之使用HttpURLConnection发送post和get请求 本节深入学习post请求. 上 节说道,post请求的OutputStream实际上不是网络流,而是写入内存,在getInputStream中才真正把写道流里面的内容作为正文与 根据之前的配置生成的http request头合并成真正的http request,并在此时才真正向服务器发送. HttpURLConnection.setChunkedStreamingMode 函数可以改变这个模式,设置了Chunke

Http学习之使用HttpURLConnection发送post和get请求(3)

使用HttpURLConnection发送post和get请求 但我们常常会碰到这样一种情况: 通过HttpURLConnection来模拟模拟用户登录Web服务器,服务器使用cookie进行用户认证.在模拟登录时,Post表单数据后可以正确登录(登陆成功时会response一个cookie,然后redirect到main page,不成功则redirect到login page),但是在使用HttpURLConnection再次连接服务器其他页面(或者即使是当前的response里是redir

Http学习之使用HttpURLConnection发送post和get请求(1)

最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内.在Java中可以使用HttpURLConnection发起这两种请求,了解此类,对于了解soap,和编写servlet的自动测试代码都有很大的帮助. 项目结构 其中jsp1.jsp的代码 <%@ page language="java" import=&quo

HttpUrlConnection发送GET、POST请求

之前在使用AsyncHttpClient的时候,遇到在Android6.0后找不到HttpClient的问题,后来官方更新了1.4.9版本替换了HttpClient为第三方的cz.msebera.android.httpclient.了解到Google在Android6.0后移除了HttpClient,推荐使用HttpUrlConnection实现http请求,并且许多其他第三方网络请求框架都是改为以HttpUrlConnection为基础,故此认为有必要熟悉一下其基本用法. 使用的流程: 1

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比 在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比. 使用httpclient中的链接池发送http请求 使用最新的4.5.2版httpclient进行实现.在maven中引入 <

学习JSP中如何发送一个动态图像

武汉java培训学习JSP中如何发送一个动态图像,你是否曾经想过从jsp页面(或者servlet)中发送动态产生的图像?这篇技巧告诉你如何做.要运行这里的代码,你需要一个Tomcat或者其他支持JSP 1.1的web服务器. 当一个web页面带有imagejpeg (或者其他的图像格式)的MIME类型被发送时,你的浏览器将那个返回结果当作一个图像,然后浏览器显示图像,作为页面的一部分或者完全作为图像自身.要为你的jsp页面设置MIME类型,你需要设置页面的contentType属性:<%@ pa

JS学习笔记--仿手机发送内容交互

学习JS笔记----记录上课中学习的知识点,分享下老师教的内容: 1.html内容 <div id="box"> <div id="message"> <!--<p class="left"> <img src="img/136.jpg" /> <span>这是第一句话</span> </p> <p class="righ

HttpURLConnection发送请求

每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响.如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字.JAVA使用HttpURLConnection发送POST数据是依靠OutputStream流的形

【JAVA】通过URLConnection/HttpURLConnection发送HTTP请求的方法

Java原生的API可用于发送HTTP请求 即java.net.URL.java.net.URLConnection,JDK自带的类: 1.通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection) 2.设置请求的参数 3.发送请求 4.以输入流的形式获取返回内容 5.关闭输入流 封装请求类 1 package com.util; 2 3 import java.io.BufferedReader; 4 import java.io.IOExcept