前提:通过HttpClient来实现

方式一:以form表单形式提交数据

1.所需jar包

  commons-logging-1.1.1.jar

  httpclient-4.5.jar

  httpcore-4.4.1.jar

2.代码实现

  客户端如何发送请求?

  导入

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
* 以form表单形式提交数据,发送post请求
* @explain
* 1.请求头:httppost.setHeader("Content-Type","application/x-www-form-urlencoded")
* 2.提交的数据格式:key1=value1&key2=value2...
* @param url 请求地址
* @param paramsMap 具体数据
* @return 服务器返回数据
*/
public static String httpPostWithForm(String url,Map<String, String> paramsMap){
// 用于接收返回的结果
String resultData ="";
try {
HttpPost post = new HttpPost(url);
List<BasicNameValuePair> pairList = new ArrayList<BasicNameValuePair>();
// 迭代Map-->取出key,value放到BasicNameValuePair对象中-->添加到list中
for (String key : paramsMap.keySet()) {
pairList.add(new BasicNameValuePair(key, paramsMap.get(key)));
}
UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(pairList, "utf-8");
post.setEntity(uefe);
// 创建一个http客户端
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// 发送post请求
HttpResponse response = httpClient.execute(post); // 状态码为:200
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
// 返回数据:
resultData = EntityUtils.toString(response.getEntity(),"UTF-8");
}else{
throw new RuntimeException("接口连接失败!");
}
} catch (Exception e) {
throw new RuntimeException("接口连接失败!");
}
return resultData;
}  

  服务器端如何接收客户端传递的数据?

  request.getParameter("key")

3.客户端调用测试

public static void main(String[] args) {
String requestUrl = "http://localhost:8070/test/rz/server/rzxx/at_VaildToken.do";
Map<String, String> paramsMap = new HashMap<String, String>(1);
paramsMap.put("un_value", "B022420184794C7C9D5096CC5F3AE7D2");
// 发送post请求并接收返回结果
String resultData = httpPostWithForm(requestUrl, paramsMap);
System.out.println(resultData);
}

方式二:以JSONObject形式提交数据

1.所需jar包

2.代码实现

  客户端如何发送请求?

  所需jar包:

  commons-httpclient-3.0.jar

  commons-codec-1.9.jar

  commons-logging-1.1.1.jar

  导入

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
/**
* 以json格式字符串形式提交数据,发送post请求
* @explain
* 1.请求头:httppost.setHeader("Content-Type","application/json")
* 2.提交的数据格式:"{"key1":"value1","key2":"value2",...}"
* @param jsonStr
* json字符串
* @return 服务器返回数据
*/
public static String sendPostWithJson(String url, String jsonStr) {
// 用于接收返回的结果
String jsonResult = "";
try {
HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(3000); // //设置连接超时
client.getHttpConnectionManager().getParams().setSoTimeout(180000); // //设置读取数据超时
client.getParams().setContentCharset("UTF-8");
PostMethod postMethod = new PostMethod(url);
postMethod.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
// 非空
if (null != jsonStr && !"".equals(jsonStr)) {
StringRequestEntity requestEntity = new StringRequestEntity(jsonStr, "application/json", "UTF-8");
postMethod.setRequestEntity(requestEntity);
}
int status = client.executeMethod(postMethod);
if (status == HttpStatus.SC_OK) {
jsonResult = postMethod.getResponseBodyAsString();
} else {
throw new RuntimeException("接口连接失败!");
}
} catch (Exception e) {
throw new RuntimeException("接口连接失败!");
}
return jsonResult;
}

  服务器端如何接收客户端传递的数据?

   所需jar包:

  commons-beanutils-1.8.0.jar

  commons-collections-3.2.1.jar

  commons-lang-2.5.jar

  commons-logging-1.1.1.jar

  ezmorph-1.0.6.jar

  json-lib-2.4-jdk15.jar

  导入

import java.io.BufferedReader;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONObject;
/**
* 获取接口传递的JSON数据
* @explain
* @param request
* HttpServletRequest对象
* @return JSON格式数据
*/
public static JSONObject getJsonReqData(HttpServletRequest request) {
StringBuffer sb = new StringBuffer();
JSONObject jo = null;
BufferedReader reader = null;
try {
// json格式字符串
String jsonStr = "";
// 获取application/json格式数据,返回字符流
reader = request.getReader();
// 对字符流进行解析
while ((jsonStr = reader.readLine()) != null) {
sb.append(jsonStr);
} } catch (IOException e) {
log.error("request请求解析失败:" + e.getMessage());
throw new RuntimeException("request请求解析失败:" + e.getMessage());
} finally {// 关闭流,避免一直占用该流资源,导致浪费
try {
if (null != reader) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
log.info("接收的参数信息为:{}" + sb.toString());
// 将json字符串(jsonStr)-->json对象(JSONObject)
try {
jo = JSONObject.fromObject(sb.toString());
} catch (Exception e) {
throw new RuntimeException("请求参数不是json格式数据!");
}
return jo;
}

3.客户端调用测试

public static void main(String[] args) {
String requestUrl = "http://localhost:8070/test/rz/server/rzxx/at_VaildToken.do";
String jsonStr = "{\"un_value\":\"B022420184794C7C9D5096CC5F3AE7D2\"}";
// 发送post请求并接收返回结果
String resultData = sendPostWithJson(requestUrl, jsonStr);
System.out.println(resultData);
}

4.服务端接收测试

public static void main(String[] args) {
//获取接口json数据
JSONObject jsonRequest = getJsonReqData(WebUtils.getRequest());
String s = jsonRequest.get("un_value").toString();// B022420184794C7C9D5096CC5F3AE7D2
// 或
s = jsonRequest.getString("un_value");// B022420184794C7C9D5096CC5F3AE7D2
}

PS:20191211(合并版)

java作为客户端,去请求另一台服务器,数据格式完全可以以流的形式进行传送和接收,这样不管是form表单还是json都可以采用一种方式搞定。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.lang3.StringUtils;
/**
* java发送post请求(暂时只支持form表单提交和json数据提交两种方式,还可以根据需要自行扩展)
* @expalin 说明:
* form表单提交,要求参数格式必须是遵循form参数规范;
* json数据提交,要求参数格式必须是遵循json标准规范。
* @param url
* 服务器地址
* @param param
* 请求参数
* 格式一:form表单形式,param1=value1&param2=value2&...
* 格式二:json数据形式,{"param1":"value1","param2":"value2",...}
* @param contentType
* 数据类型(暂时提供两种)
* 格式一:form表单,application/x-www-form-urlencoded
* 格式二:json数据,application/json
* @param charset
* 字符集
* 如果不传,默认值为:utf-8
*/
public static String sendPostRequest(String url, String param, String contentType, String charset) {
// 请求方法:post、get
String requestMethod = "POST";
// 数据类型
if ("form".equals(contentType)) {
contentType = "application/x-www-form-urlencoded";
} else if ("json".equals(contentType)) {
contentType = "application/json";
}
// 告诉请求数据的字符集
charset = "".equals(charset) ? "utf-8" : charset; // 用于接收服务器返回结果
StringBuffer responseResult = new StringBuffer();
HttpURLConnection conn = null;
OutputStream out = null;
BufferedReader reader = null;
try {
// 打开网址
URL requestUrl = new URL(url);
conn = (HttpURLConnection) requestUrl.openConnection();
// 连接设置
conn.setRequestMethod(requestMethod);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", contentType + ";" + charset);
// 进行连接
conn.connect();
// 将数据以流的形式进行传输(二进制)
out = conn.getOutputStream();
out.write(param.getBytes());
out.flush(); // 响应状态码:200-代表正常
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
throw new RuntimeException("Error responseCode:" + responseCode);
} // 获取服务器响应数据字符集
String responseEncoding = conn.getContentEncoding();
responseEncoding = StringUtils.isEmpty(responseEncoding) ? "utf-8" : responseEncoding;
// 读取服务器响应数据
String output = null;
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), responseEncoding));
while ((output = reader.readLine()) != null) {
responseResult.append(output);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("调用接口出错:param=" + param);
} finally {
try {
if (reader != null) {
reader.close();
}
if (out != null) {
out.close();
}
if (conn != null) {
conn.disconnect();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return responseResult.toString();
}

20200403

  这样的话,接收数据的服务器不用再区分传过来的是form表单还是json,统一按照接收json那样以字符流的形式进行读取即可。

  当然了,这还得和服务器协商好,不然你传过去的是二进制,它却还是按照request.getParameter(),服务器肯定接收不到。

  另外,如果是浏览器按照application/x-www-form-urlencoded的编码格式向后台传递数据的话,服务器只能用request.getParameter()来接收,这才是规范用法。

 

JavaWeb 发送post请求的2种方式(form、json)的更多相关文章

  1. PHP发送HTTP请求的几种方式

    转发:https://blog.tanteng.me/2017/07/php-curl-guzzlehttp/ 1)PHP开发中我们常用CURL 方式封装 HTTP请求,什么是CURL? CURL 是 ...

  2. [转]使用 curl 发送 POST 请求的几种方式

    HTTP 的 POST 请求通常是用于提交数据,可以通过这篇文章来了解各种提交方式:四种常见的 POST 提交数据方式.做 Web 后端开发时,不可避免地要自己给自己发请求来调试接口,这里要记录的内容 ...

  3. Python使用requests发送post请求的三种方式

    1.我们使用postman进行接口测试的时候,发现POST请求方式的编码有3种,具体的编码方式如下: A:application/x-www-form-urlencoded ==最常见的post提交数 ...

  4. 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础

    1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...

  5. 使用jmeter发送put请求的三种方式

    之前在前公司使用jmeter调试接口时,由于都是get和post请求,所以一直是顺风顺水的,毫无阻拦在短时间内调试完所有接口. 但是呢,在换到新公司后,发现接口请求是多式多样的,get.post必须有 ...

  6. PHP 发送HTTP请求的几种方式

    1.curl仍然是最好的HTTP库,没有之一. 可以解决任何复杂的应用场景中的HTTP 请求2. 文件流式的HTTP请求比较适合处理简单的HTTP POST/GET请求,但不适用于复杂的HTTP请求3 ...

  7. .Net Core下发送WebRequest请求的两种方式

    1.使用RestSharp.NetCore 2.使用WebApi请求方式

  8. php发送post请求的4种方式

    http://blog.163.com/fan_xy_qingyuan/blog/static/188987748201411943815244/ class Request{ public stat ...

  9. PHP发送POST请求的三种方式

    class Request{ public static function post($url, $post_data = '', $timeout = 5){//curl $ch = curl_in ...

随机推荐

  1. 输入输出格式之Python版

    # 有多组输入数据,但没有具体的告诉你有多少组,只是让你对应每组输入,应该怎样输出. while True: try: a, b = map(int, raw_input().strip().spli ...

  2. 打开eclipse 时出现Failed to load the JNIshared libraryd的解决方式

    由于电脑重装系统,所以电脑的jdk,与eclipse需要重新配置,今天配置完成jdk之后,打开eclipse出现了Failed to load the JNIshared libraryd的错误,如下 ...

  3. Sd - Hibernate

    Sd - Hibernate 附:http://blog.csdn.net/ta8210/article/details/1582162 数据库连接池实现原理 http://hi.baidu.com/ ...

  4. [NOIP2016]天天爱跑步(树上差分+线段树合并)

    将每个人跑步的路径拆分成x->lca,lca->y两条路径分别考虑: 对于在点i的观察点,这个人(s->t)能被观察到的充要条件为: 1.直向上的路径:w[i]=dep[s]-dep ...

  5. hdu 4489 The King’s Ups and Downs(基础dp)

    The King’s Ups and Downs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  6. 【记忆化搜索】codevs2823锁妖塔

    [codevs2823]锁妖塔 Description 琐妖塔会在一会儿后倒塌.大量妖魔涌出塔去,塔内的楼梯都挤满了人(哦,错了,是妖),(那他们怎么不飞下去--)要求是,景天一行一定要下塔,琐妖塔一 ...

  7. [bzoj1006](HNOI2008)神奇的国度(弦图最小染色)【太难不会】

    Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关 ...

  8. BUG:php7.1 访问yii数据库 自动加端口3306 报错

    跟新完php7.1后访问yii项目出现下图错误 可见数据库链接是已经制指定了端口号9004 但是访问时后续自动加上了3306 原因:换了方式 //这种方式只支持5.6版本php 'db' => ...

  9. Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  10. 扩展 jQuery datebox控件按钮

    功能需求: 自定义扩展,将原先的datebox控件按钮进行自定义的扩展: 1.问题: 对原先的时间按钮控件进行更改扩展,新增 “一刻钟” “半小时” “一小时” 选项. 获取原先的 datebox 对 ...