概述:

http请求在所有的编程语言中几乎都是支持的,我们常用的两种为:GET,POST请求。一般情况下,发送一个GET请求都很简单,因为参数直接放在请求的URL上,所以,对于PHP这种语言,甚至只需要一行:file_get_content(url);就能完成数据的获取,但对于POST请求,由于其数据是在消息体中发送出去的,所以相对来说要麻烦一点,再涉及到需要发送文件等二进制的数据类型,就更需要更多的处理,下面我们用Java语言来实现POST请求发送数据,其他语言类似。

  1. public class MainUI {
  2.  
  3. private static final String REQUEST_PATH = "http://localhost/server_url.php";
  4. private static final String BOUNDARY = "20140501";
  5.  
  6. /**
  7. * @param args
  8. * @throws Exception
  9. */
  10. public static void main(String[] args) throws Exception {
  11. // TODO Auto-generated method stub
  12.  
  13. URL url = new URL(REQUEST_PATH);
  14. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  15. httpConn.setConnectTimeout(3000); // 设置发起连接的等待时间,3s
  16. httpConn.setReadTimeout(30000); // 设置数据读取超时的时间,30s
  17. httpConn.setUseCaches(false); // 设置不使用缓存
  18. httpConn.setDoOutput(true);
  19. httpConn.setRequestMethod("POST");
  20.  
  21. httpConn.setRequestProperty("Connection", "Keep-Alive");
  22. httpConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
  23. httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
  24. OutputStream os = httpConn.getOutputStream();
  25. BufferedOutputStream bos = new BufferedOutputStream(os);
  26.  
  27. String content = "--" + BOUNDARY + "\r\n";
  28. content += "Content-Disposition: form-data; name=\"title\"" + "\r\n\r\n";
  29. content += "我是post数据的值";
  30. content += "\r\n--" + BOUNDARY + "\r\n";
  31. content += "Content-Disposition: form-data; name=\"cover_img\"; filename=\"avatar.jpg\"\r\n";
  32. content += "Content-Type: image/jpeg\r\n\r\n";
  33. bos.write(content.getBytes());
  34.  
  35. // 开始写出文件的二进制数据
  36. FileInputStream fin = new FileInputStream(new File("avatar.jpg"));
  37. BufferedInputStream bfi = new BufferedInputStream(fin);
  38. byte[] buffer = new byte[4096];
  39. int bytes = bfi.read(buffer, 0, buffer.length);
  40. while (bytes != -1) {
  41. bos.write(buffer, 0, bytes);
  42. bytes = bfi.read(buffer, 0, buffer.length);
  43. }
  44. bfi.close();
  45. fin.close();
  46. bos.write(("\r\n--" + BOUNDARY).getBytes());
  47. bos.flush();
  48. bos.close();
  49. os.close();
  50.  
  51. // 读取返回数据
  52. StringBuffer strBuf = new StringBuffer();
  53. BufferedReader reader = new BufferedReader(new InputStreamReader(
  54. httpConn.getInputStream()));
  55. String line = null;
  56. while ((line = reader.readLine()) != null) {
  57. strBuf.append(line).append("\n");
  58. }
  59. String res = strBuf.toString();
  60. System.out.println(res);
  61. reader.close();
  62. httpConn.disconnect();
  63. }
  64.  
  65. }

下面,对上述的代码做一些必要的说明:

http发送的post数据是通过boundary和换行符来分割的,boundary是一个随机的字符串即可,但不要与你传递的参数名或参数值相同。

换行符要求也是比较严格的,数据的声明和数据的值之间需要两个换行符,两个数据之间要用boundary来划分。对于二进制的数据来说,只是参数的类型声明和普通的数据有点区别,比如上述的代码增加了filename和content-type,二进制的数据以字符流写出去就行了。

Java发送HTTP POST请求示例的更多相关文章

  1. java发送http get请求的两种方式

    长话短说,废话不说 一.第一种方式,通过HttpClient方式,代码如下: public static String httpGet(String url, String charset) thro ...

  2. Java 发送http post 请求

    package com.sm.utils; import java.io.BufferedReader; import java.io.InputStreamReader; import java.i ...

  3. java 发送get,post请求

    package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  4. Java发送HTTP POST请求(内容为xml格式)

    今天在给平台用户提供http简单接口的时候,顺便写了个调用的Java类供他参考.      服务器地址:http://5.0.217.50:17001/VideoSend 服务器提供的是xml格式的h ...

  5. java 发送http json请求

    public void getRemoteId(HttpServletRequest request,Model model){ String name = request.getParameter( ...

  6. JAVA发送http GET/POST请求的两种方式+JAVA http 请求手动配置代理

    java发送http get请求,有两种方式. 第一种用URLConnection: public static String get(String url) throws IOException { ...

  7. Java发送Http请求并获取状态码

    通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...

  8. 编写爬虫(spider)的预备知识:用java发送HTTP请求

    使用原生API来发送http请求,而不是使用apache的库,原因在于这个第三方库变化实在太快了,每个版本都有不小的变化.对于程序员来说,使用它反而会有很多麻烦,比如自己曾经写过的代码将无法复用. 原 ...

  9. 通过java发送http请求

    通常的http请求都是由用户点击某个连接或者按钮来发起的,但是在一些后台的Java程序中需要发送一些get或这post请求,因为不涉及前台页面,该怎么办呢? 下面为大家提供一个Java发送http请求 ...

随机推荐

  1. imperva-代理安装

    首先创建网关上面的监听端口

  2. SQl 跨服务器查询脚本示例

    1.采用OPENDATASOURCE select top 10 *from OPENDATASOURCE('SQLOLEDB','Data Source=IP地址;User ID=连接用户名称;Pa ...

  3. mysql5.7.10 源码编译安装记录 (centos6.4)【转】

    一.准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系 ...

  4. Windows 10安装MongoDB(安装&启动)

    Windows 10家庭中文版,MongoDB 3.6.3, 最近在学习Scrapy,可以却从未将scraped data存储到数据库中.在看过一些文档后,Scrapy会和MongoDB结合使用(还有 ...

  5. 数据库-mysql储存过程

    存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行. 一:创建存储过程 MariaDB [test2]> delimiter // MariaDB [tes ...

  6. Win10搜索不能用

    使用win10进行搜索时,一直显示win10特色的滚动条,但就是检索不出东西,我的主要是检索不到windows的内容: (个人感觉使用win10检索网页内容不太专业,就关闭了Web搜索) 最后有发现网 ...

  7. tensorflow中的boolean_mask

    将mask中所有为true的抽取出来,放到一起,这里从n维降到1维度 tensor = [[1, 2], [3, 4], [5, 6]] import numpy as np mask=np.arra ...

  8. [转] Cacti+Nagios监控平台完美整合

    Cacti+Nagios监控平台完美整合 http://os.51cto.com/art/201411/458006.htm 整合nagios+cacti+微信.飞信实现网络监控报警 http://b ...

  9. thinkphp模版常量替换机制

  10. MySQL学习笔记:regexp正则表达式

    在MySQL中,模糊搜索的时候主要用两种方式: 1.like2.regexp + 正则表达式 性能优于like 正则表达式描述了一组字符串. 最简单的正则表达式是不含任何特殊字符的正则表达式.例如,正 ...