Http Post请求示例
1.maven中jar设置
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>2.请求javabean示例
@Data
public class NetOrderRequest {
private String StartDate; //开始日期:
private String EndDate; //结束日期:
private String OrderStatus; //订单状态:
private String BranchNo; //网点编号:
private String OutletType; //网点类型:
private String SchemeBatch; //方案批次:
private String StatisticalUnit;//统计单位:
}3.http-post请求
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import net.sf.json.JSONObject;
public class HttpTest{
public static final String ADD_URL = "http://192.168.18.106:8880/testE";
public static final String Encoding = "UTF-8";
public static void HttpPostHandler(String path) {
try {
//创建连接
URL url = new URL(ADD_URL);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setConnectTimeout(30000);//设置连接主机超时(单位:毫秒)
connection.setReadTimeout(30000); //设置从主机读取数据超时(单位:毫秒)
connection.setDoOutput(true); // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 http正文内,因此需要设为true, 默认情况下是false;
connection.setDoInput(true); //设置是否从httpUrlConnection读入,默认情况下是true;
connection.setRequestMethod("POST");//设定请求的方法为"POST",默认是GET
connection.setUseCaches(false); //post 请求不能使用缓存
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type","application/json");//设定传送的内容类型json格式的数据
connection.connect(); //建立连接
//POST请求
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
//json数据传送参数
JSONObject obj = new JSONObject();
obj.element("startDate", "asdf");
obj.element("endDate", "10.21.243.234");
obj.element("orderStatus", 8080);
obj.element("branchNo", "001");
obj.element("outletType", "asd");
obj.element("schemeBatch", "asd");
obj.element("statisticalUnit", "dasd");
System.out.println(obj.toString());
out.writeBytes(obj.toString());
out.flush();
out.close();
//读取响应
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String lines;
StringBuffer sb = new StringBuffer("");
while ((lines = reader.readLine()) != null) {
lines = new String(lines.getBytes(), Encoding);
sb.append(lines);
}
System.out.println(sb);
reader.close();
// 断开连接
connection.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
HttpPostHandler(ADD_URL);
}
}4.springboot服务搭建
@RestController
public class EController {
@RequestMapping("/testE")
public String E(@RequestBody NetOrderRequest netOrderRequest){
System.out.println(netOrderRequest.getEndDate());
System.out.println(netOrderRequest.toString());
return new Gson().toJson(new NetOrderResponse()).toString();
}
}5.总结
(1).HttpURLConnection的connect()函数,建立与服务器的tcp连接,但没有实际发送http请求。 无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()函数才正式发送出去。
(2).用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重, 连接对象(get,set函数) 必须在connect()函数执行之前完成。对outputStream的写操作,必须在inputStream的读操作之前。 这些顺序实际上是由http请求的格式决定的。
(3).http请求由两部分组成, 一个是http头,所有http请求配置都在http头里面定义, 另一个是正文content。 connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前,必须把所有的配置准备好。
(4).http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的,outputStream是字符串流,写入的数据不会立即发送到网络, 而是存在于内存缓冲区中,等待outputStream流关闭时,根据输入的内容生成http正文。
此时,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。
(5).由于http 请求在getInputStream的时候已经发送出去(包括http头和正文),因此在getInputStream()函数 之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。
文章标题:Http Post请求示例
发布时间:2020-05-29, 11:03:56
最后更新:2020-05-29, 11:03:57