当前位置: 首页 > news >正文

超级网站模板下载二次开发创造作用

超级网站模板下载,二次开发创造作用,合肥平台网站建设,企业网站seo多少钱时间 2014-12-11 12:41:43 CSDN博客原文 http://blog.csdn.net/bboyfeiyu/article/details/41863951主题 HTTP HttpComponents在开发中#xff0c;我们使用的比较多的HTTP请求方式基本上就是GET、POST。其中GET用于从服务器获取数据#xff0c;POST主要用于向服务器提交一些… 时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTP HttpComponents 在开发中我们使用的比较多的HTTP请求方式基本上就是GET、POST。其中GET用于从服务器获取数据POST主要用于向服务器提交一些表单数据例如文件上传等。而我们在使用HTTP请求时中遇到的比较麻烦的事情就是构造文件上传的HTTP报文格式这个格式虽说也比较简单但也比较容易出错。今天我们就一起来学习HTTP POST的报文格式以及通过Java来模拟文件上传的请求。 首先我们来看一个POST的报文请求然后我们再来详细的分析它。 POST报文格式 POST /api/feed/ HTTP/1.1 Accept-Encoding: gzip Content-Length: 225873 Content-Type: multipart/form-data; boundaryOCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp Host: www.myhost.com Connection: Keep-Alive --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp Content-Disposition: form-data; namelng Content-Type: text/plain; charsetUTF-8 Content-Transfer-Encoding: 8bit 116.361545 --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp Content-Disposition: form-data; namelat Content-Type: text/plain; charsetUTF-8 Content-Transfer-Encoding: 8bit 39.979006 --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp Content-Disposition: form-data; nameimages; filename/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg Content-Type: application/octet-stream Content-Transfer-Encoding: binary 这里是图片的二进制数据 --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp-- 这里我们提交的是经度、纬度和一张图片图片数据比较长而且比较杂乱这里省略掉了。 格式分析 请求头分析 我们先看 报文格式中的第一行 POST /api/feed/ HTTP/1.1 这一行就说明了这个请求的请求方式即为POST方式要请求的子路径为/api/feed/,例如我们的服务器地址为www.myhost.com,然后我们的这个请求的完整路径就是www.myhost.com/api/feed/最后说明了HTTP协议的版本号为1.1。 Accept-Encoding: gzip Content-Length: 225873 Content-Type: multipart/form-data; boundaryOCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp Host: www.myhost.com Connection: Keep-Alive 这几个header的意思分别为服务器返回的数据需要使用gzip压缩、请求的内容长度为225873、内容的类型为multipart/form-data、请求参数分隔符(boundary)为OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp、请求的根域名为www.myhost.com、HTTP连接方式为持久连接( Keep-Alive)。 其中这里需要注意的一点是分隔符即boundary。 boundary用于作为请求参数之间的界限标识例如参数1和参数2之间需要有一个明确的界限这样服务器才能正确的解析到参数1和参数2。但是分隔符并不仅仅是boundary而是下面这样的格式-- boundary。例如这里的boundary为 OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp那么参数分隔符则为: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp 不管boundary本身有没有这个--这个--都是不能省略的。 我们知道HTTP协议采用“请求-应答”模式当使用普通模式即非KeepAlive模式时每个请求/应答客户和服务器都要新建一个连接完成之后立即断开连接HTTP协议为无连接的协议当使用Keep-Alive模式又称持久连接、连接重用时Keep-Alive功能使客户端到服务器端的连接持续有效当出现对服务器的后续请求时Keep-Alive功能避免了建立或者重新建立连接。 如上图中左边的是关闭Keep-Alive的情况每次请求都需要建立连接然后关闭连接右边的则是Keep-Alive在第一次建立请求之后保持连接然后后续的就不需要每次都建立、关闭连接了 启用Keep-Alive模式肯定更高效性能更高因为避免了建立/释放连接的开销 。 http 1.0中默认是关闭的需要在http头加入Connection: Keep-Alive才能启用Keep-Alivehttp 1.1中默认启用Keep-Alive如果加入Connection: close 才关闭。目前大部分浏览器都是用http1.1协议也就是说默认都会发起Keep-Alive的连接请求了所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。 请求实体分析 请求实体其实就是HTTP POST请求的参数列表每个参数以请求分隔符开始即-- boundary。例如下面这个参数。 --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp Content-Disposition: form-data; namelng Content-Type: text/plain; charsetUTF-8 Content-Transfer-Encoding: 8bit 116.361545 上面第一行为--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp也就是--加上boundary内容 最后加上一个换行 这个换行不能省略换行的字符串表示为\r\n 。第二行为Content-Disposition和参数名,这里的参数名为lng即经度。 Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名这里我们不过多关注。第三行为 Content-Type即 WEB 服务器告诉浏览器自己响应的对象的类型 还有指定字符编码为UTF-8。 第四行是 描述的是消息请求(request)和响应(response)所附带的实体对象(entity)的传输形式 简单文本数据我们设置为8bit文件参数我们设置为binary就行 。然后添加两个换行之后才是参数的具体内容。例如这里的参数内容为116.361545。 注意这里的每行之间都是使用“\r\n”来换行的最后一行和参数内容之间是两个换行。文件参数也是一样的格式只是文件参数的内容是字节流。 这里要注意一下普通文本参数和文件参数有如下两个地方的不同因为其内容本身的格式是不一样的。 普通参数 Content-Type: text/plain; charsetUTF-8 Content-Transfer-Encoding: 8bit 文件参数 Content-Type: application/octet-stream Content-Transfer-Encoding: binary 参数实体的最后一行是: --加上boundary加上--最后换行这里的 格式即为: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--。 模拟文件上传请求 public static void uploadFile(String fileName) {try {// 换行符 final String newLine \r\n; final String boundaryPrefix --; // 定义数据分隔线 String BOUNDARY 7d4a6d158c9; // 服务器的域名 URL url new URL(www.myhost.com); HttpURLConnection conn (HttpURLConnection) url.openConnection(); // 设置为POST情 conn.setRequestMethod(POST); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求头参数 conn.setRequestProperty(connection, Keep-Alive); conn.setRequestProperty(Charsert, UTF-8); conn.setRequestProperty(Content-Type, multipart/form-data; boundary BOUNDARY); OutputStream out new DataOutputStream(conn.getOutputStream()); // 上传文件 File file new File(fileName); StringBuilder sb new StringBuilder(); sb.append(boundaryPrefix); sb.append(BOUNDARY); sb.append(newLine); // 文件参数,photo参数名可以随意修改 sb.append(Content-Disposition: form-data;name\photo\;filename\ fileName \ newLine); sb.append(Content-Type:application/octet-stream); // 参数头设置完以后需要两个换行然后才是参数内容 sb.append(newLine); sb.append(newLine); // 将参数头的数据写入到输出流中 out.write(sb.toString().getBytes()); // 数据输入流,用于读取文件数据 DataInputStream in new DataInputStream(new FileInputStream( file)); byte[] bufferOut new byte[1024]; int bytes 0; // 每次读1KB数据,并且将文件数据写入到输出流中 while ((bytes in.read(bufferOut)) ! -1) { out.write(bufferOut, 0, bytes); } // 最后添加换行 out.write(newLine.getBytes()); in.close(); // 定义最后数据分隔线即--加上BOUNDARY再加上--。 byte[] end_data (newLine boundaryPrefix BOUNDARY boundaryPrefix newLine) .getBytes(); // 写上结尾标识 out.write(end_data); out.flush(); out.close(); // 定义BufferedReader输入流来读取URL的响应 // BufferedReader reader new BufferedReader(new InputStreamReader( // conn.getInputStream())); // String line null; // while ((line reader.readLine()) ! null) { // System.out.println(line); // } } catch (Exception e) { System.out.println(发送POST请求出现异常 e); e.printStackTrace(); } } 使用Apache Httpmime上传文件 /*** param fileName 图片路径*/public static void uploadFileWithHttpMime(String fileName) { // 定义请求url String uri www.myhost.com; // 实例化http客户端 HttpClient httpClient new DefaultHttpClient(); // 实例化post提交方式 HttpPost post new HttpPost(uri); // 添加json参数 try { // 实例化参数对象 MultipartEntity params new MultipartEntity(); // 图片文本参数 params.addPart(textParams, new StringBody( {user_name:我的用户名,channel_name:却道明,channel_address:(123.4,30.6)}, Charset.forName(UTF-8))); // 设置上传文件 File file new File(fileName); // 文件参数内容 FileBody fileBody new FileBody(file); // 添加文件参数 params.addPart(photo, fileBody); params.addPart(photoName, new StringBody(file.getName())); // 将参数加入post请求体中 post.setEntity(params); // 执行post请求并得到返回对象 [ 到这一步我们的请求就开始了 ] HttpResponse resp httpClient.execute(post); // 解析返回请求结果 HttpEntity entity resp.getEntity(); InputStream is entity.getContent(); BufferedReader reader new BufferedReader(new InputStreamReader(is)); StringBuffer buffer new StringBuffer(); String temp; while ((temp reader.readLine()) ! null) { buffer.append(temp); } System.out.println(buffer); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } } HttpMime.jar下载地址  下载httpClient的压缩包即可httpmime.jar包含在其中。     转自链接
http://www.yutouwan.com/news/44701/

相关文章:

  • 健康私人定制网站怎么做小浣熊做单网站
  • 网站项目设计与制作综合实训做网站原型的软件
  • 有没有专门发布毕业设计代做网站dw做的网站与浏览器不匹配
  • 四川杰新建设工程网站恶意镜像网站程序
  • 赣州网站建设-赣州做网站怎样建立一个自己的网站
  • 做百度移动端网站优电商网名
  • php网站开发 薪资 东莞好多网站权重都没了
  • 管理网站开发教程2023新闻摘抄大全
  • 百度推广送企业网站吗线下营销推广方式都有哪些
  • 建站需要钱大自然的网站设计
  • 网站常见攻击店铺装修设计软件
  • 什么网站做adsense好品牌建设 企业发言
  • 三丰云做游戏网站网站改版公司
  • 网站制作价咕叽网 wordpress
  • 外贸网站为何搜不到光谷企业网站建设
  • 广汉做网站行业门户网站有什么作用
  • 做网站的价怎么做好网站开发_设计
  • 设计方案ppt模板windows优化大师卸载
  • 网站系统怎么建设网站建栏目建那些
  • 限时抢购网站源码做音乐网站的目地
  • 校园网络建设方案设计seo基础
  • 2二级域名免费一键seo提交收录
  • linux tomcat 网站目录制作网页常见的布局方法有
  • 手机网站开发用什么语言外国人做的中国字网站
  • 上海缪斯设计公司官网seo网站外链专发
  • 软件下载网站模版教育网站集群建设申请
  • 手机怎样设计网站建设装饰设计行业前景怎么样
  • 漳州微网站建设公司怎样下载软件到电脑桌面上
  • 网站要怎么做才专业小视频做网站怎么赚钱
  • 白酒公司网站的建设吉林网络推广代运营