post方式的的请求过程:

// 设置是否向httpUrlConnection输出,由于这个是post请求,參数要放在

// http正文内,因此须要设为true, 默认情况下是false;

httpUrlConnection.setDoOutput(true);

// 设置是否从httpUrlConnection读入,默认情况下是true;

httpUrlConnection.setDoInput(true);

// Post 请求不能使用缓存

httpUrlConnection.setUseCaches(false);

// 设定传送的内容类型是可序列化的java对象

// (假设不设此项,在传送序列化对象时,当WEB服务默认的不是这样的类型时可能抛java.io.EOFException)

httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");

// 设定请求的方法为"POST"。默认是GET

httpUrlConnection.setRequestMethod("POST");

//參数配置必需要在connect之前完毕,

httpUrlConnection.connect();

// 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法。

// 所以在开发中不调用上述的connect()也能够)。

OutputStream outStrm = httpUrlConnection.getOutputStream();

// 如今通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。

ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);

// 向对象输出流写出数据,这些数据将存到内存缓冲区中

objOutputStrm.writeObject(new String("我是測试数据"));

// 刷新对象输出流,将不论什么字节都写入潜在的流中(些处为ObjectOutputStream)

objOutputStm.flush();

// 关闭流对象。

此时,不能再向对象输出流写入不论什么数据。先前写入的数据存在于内存缓//冲区中, 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到server

objOutputStm.close();

// 调用HttpURLConnection连接对象的getInputStream()函数, 

// 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。

InputStream inStrm = httpConn.getInputStream(); // <==注意,实际发送请求的代码段就在这里

// 上边的httpConn.getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的//输出已无意义, 既使对象输出流没有调用close()方法,下边的操作也不会向对象输出流//写入不论什么数据. 因此,要又一次发送数据时须要又一次创建连接、又一次设參数、又一次创建流对//象、又一次写数据、 又一次发送数据(至于是否不用又一次这些操作须要再研究)

objOutputStm.writeObject(new String(""));

httpConn.getInputStream();

OutputStream os = httpConn.getOutputStream();

String param = new String();

param = "CorpID=" + CorpID + "&LoginName=" + LoginName+ "&send_no=" + phoneNumber + 

                    "&msg=" + java.net.URLEncoder.encode(msg,"GBK");

os.write(param.getBytes());

//超时设置,防止网络异常的情况下,可能会导致程序僵死而不继续往下运行

System.setProperty("sun.net.client.defaultConnectTimeout", "30000");

System.setProperty("sun.net.client.defaultReadTimeout", "30000");

当中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)

sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)

JDK 1.5曾经的版本号,仅仅能通过设置这两个系统属性来控制网络超时。在1.5中,还能够使用HttpURLConnection的父类URLConnection的下面两个方法:

setConnectTimeout:设置连接主机超时(单位:毫秒)

setReadTimeout:设置从主机读取数据超时(单位:毫秒)

总结:a:) HttpURLConnection的connect()函数,实际上仅仅是建立了一个与server的tcp连接。并没有实际发送http请求。不管是post还是get。http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。

b:) 在用POST方式发送URL请求时,URL请求參数的设定顺序是重中之重。对connection对象的一切配置(那一堆set函数)都必需要在connect()函数运行之前完毕。而对outputStream的写操作,又必需要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。假设inputStream读操作在outputStream的写操作之前,会抛出例外: java.net.ProtocolException:
Cannot write output after reading input

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

d:) 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会马上发送到网络。而是存在于内存缓冲区中,待outputStream流关闭时。依据输入的内容生成http正文。至此。http请求的东西已经所有准备就绪。

在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到server了,然后返回一个输入流,用于读取server对于此次http请求的返回信息。

因为http请求在getInputStream的时候已经发送出去了(包含http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行改动)或者写入outputStream(对正文进行改动)都是没有意义的了,运行这些操作会导致异常的发生。

------------------------------------------------------------------------------------------------------------------------

stream应该是水龙头里的水资源

InputStream:是一个出水龙头(把水封装在里头)的一个实物对象。该对象的read方法呢,就想成这个

出水龙头这一机制对象的开关钮。你read或openStream(其它对象包容InputStream对象的对象方法)一下呢,就等于打开了出水龙头的button。水就出来了,里头封装的水是什么性质的呢,你就用对应的容器来装。如string或byte[].....

OutputStream:你就在InputStream基础上反着想就ok了

OutputStream:

(1)输出数据

   void write(int b)往流中写一个字节b

   void write(byte b[])往流中写一个字节数组b

   void write(byte b[],int off,int len)把字节数组b中从下标off開始,长度为len的字节写入流中

 (2)

   flush()刷空输出流,并输出全部被缓存的字节因为某些流支持缓存功能。该方法将把缓存中全部内容强制输出到流中。

(3)关闭流

   close()流操作完成后必须关闭。

------------------------------------------------------------------------------------------------------------------------

InputStream:

(1)从流中读取数据

   int read() 读取一个字节,返回值为所读得字节

   int read(byte b[]) 读取多个字节。放置到字节数组b中,通常读取的字节数量为b的长度。返回值为实际独取的字节的数量。

   int read(byte b[] ,int off,int len)读取len个字节,放置到下面标off開始字节数组b中,返回值为实际读取的字节的数量。

   int available() 返回值为流中尚未读取的字节的数量。

   long skip(long n);读指针跳过n个字节不读,返回值为实际跳过的字节数量

(2)关闭流

   close() 流操作完成后必须关闭

(3)使用输入流中的标记

   void mark(int readlimit)纪录当前指针的所在位置.readlimit表示读指针读出的readlimit个字节后所标记的指针位置才实效。

void reset() 把读指针又一次指向用mark方法所记录的位置

   boolean markSupported() 当前的流是否支持读指针的记录功能。

对于http的POST和PUT请求,发出HTTP请求应该遵循的步骤:

  1. 生成HttpURLConnection实例,并设置http请求參数或者属性;
  2. 调用getOutputStream方法获得OutputStream而且输出数据到输出流。无论你有没有数据须要发送到server端,至少你要调用一下getOutputStream()方法之后忽略数据的写入;
  3. 调用getInputStream方法发出真实的http请求。而且等待server的响应。无论你需不须要server的反馈,这个必须调用。

对于http的除了POST和PUT的其它请求(如GET。HEAD。DELETE。TRACE。OPTIONS),发出HTTP请求应该遵循的步骤:

  1. 生成HttpURLConnection实例,并设置http请求參数或者属性;
  2. 调用getInputStream方法发出真实的http请求,而且等待server的响应。

我们不能假定调用getOutputStream()获得OutputStream。写入数据,然后调用输出流的flush()/close()方法就把真实的http请求发送到server端了。其实,调用HttpURLConnection的getInputStream()方法是唯一的发出真实请求的方法。而调用getOutputStream()方法并没有发送真实的Http请求。

除此之外。使用HttpURLConnection的时候一定要依据请求的类型(POST。GET等)去遵循上面描写叙述的运行顺序。比方说你已经调用共getInputStream()方法了,你在调用getOutputStream()方法的时候就抛异常了,HttpURLConnection说这是不合法的。

httpUrlConnection的參数具体解释的更多相关文章

  1. 《转》Ceilometer Alarm API 參数具体解释 及 举例说明

    Ceilometer Alarm是H版新加入的功能,监控报警是云平台必不可少的部分,Ceilometer已经实现了比較完好的监控体系.报警怎么能缺少呢?用过AWS CloudWatch Alarm的人 ...

  2. RPM安装包-Spec文件參数具体解释与演示样例分析

    spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件. 1.Spec文件參数 spec文件包括建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个 ...

  3. fopen 參数具体解释

    fopen fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path, ...

  4. TVS參数具体解释及选型应用

    一.首先了解TVS管的參数,我们以littelfuse的5.0SMDJ系列为例. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGcybGg=/font/ ...

  5. C语言中的system函数參数具体解释

    http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令   用   法: int sy ...

  6. C语言中main函数的參数具体解释

    main函数的定义形式         main函数能够不带參数,也能够带參数,这个參数能够觉得是 main函数的形式參数.C语言规定main函数的參数仅仅能有两个,习惯上这两个參数写为argc和ar ...

  7. Linux定时器工具-crontab 各參数具体解释及怎样查看日志记录

    要使用crontab定时器工具,必需要启动cron服务: service cron start crontab的语法,以备日后救急.先上张超给力的图: crontab各參数说明: -e : 运行文字编 ...

  8. JSONObjectWithData方法里options參数选择解释

    NSJSONReadingMutableContainers  Specifies that arrays and dictionaries are created as mutable object ...

  9. mysql启动參数(/etc/my.cnf)具体解释汇总

    在linux以下的/etc/my.cnf的參数具体解释汇总 MYSQL–my.cnf配置中文具体解释 basedir = path   使用给定文件夹作为根文件夹(安装文件夹). character- ...

随机推荐

  1. 什么是JS事件冒泡

    什么是JS事件冒泡? 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个 ...

  2. logstash 分析nginx 错误日志

    [root@dr-mysql01 frontend-error]# cat logstash_error.conf input { file { type => "zj_fronten ...

  3. Linux id 命令 - 显示用户id和组id信息

    要登入一台计算机,我们需要一个用户名.用户名是一个可以被计算机识别的身份.基于此,计算机会对使用这个用户名的登陆的人应用一系列的规则.在Linux系统下,我们可以使用 id 命令. 什么是 id 命令 ...

  4. 任务调度开源框架Quartz动态加入、改动和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包括了调度器监听.作业和触发器监听.你能够配置作业和触发器监听为全局监听或者是特定于 ...

  5. RDLC报表系列(二) 行分组

    接上一篇文章的内容,今天来说的是行分组.还是打开demo1.rdlc界面,拖入一个文本框和表 1.在表中随便选择一个字段,不然在添加行组的时候不会自动提示.我这里是选择的Dept 2.在下面的行组中右 ...

  6. Oracle的分页查询语句优化

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. (一)   分页查询格式: SELECT * FROM  ( SELECT A.*, ROWNUM RN  FROM (SELECT ...

  7. Swift语法基础入门四(构造函数, 懒加载)

    Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...

  8. 搜索+剪枝——运筹帷幄 (road.cpp)

    运筹帷幄 (road.cpp) [题目描述] 刘邦军行至迷糊林,见其中瘴气围绕,又有青狼猛虎之兽,难于前行. 已知迷糊林是一个共有n个结点的图,点与点之间共有m条道路相连接,每条路有参数t,c,分别表 ...

  9. python正则表达式基础篇

    1.正则表达式基础 1.1简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...

  10. centOs下的php+mysql+apache+ftp配置

    在安装服务器时做了相应的笔记,这个方法是亲身经验成功的,随着版本的不断更新,也许会有一些地方不同,但是基本原理都是一样的. 1.安装CentOS 6 ,可以选择最小安装,也可以安装桌面 2.升级系统 ...