当前位置:首页 > 编程教程 > java技术文章 > Java编程Post数据请求和接收代码详解

关于Java Post数据请求和接收代码实例

  • 发布时间:
  • 作者:码农之家
  • 点击:116

这篇文章主要知识点是关于Java、Post、数据请求、接收代码、解决java使用axios.js的post请求后台时无法接收到入参的问题 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

精通Java并发编程
  • 类型:Java大小:200.7 MB格式:PDF作者:哈维尔
立即下载

Java编程Post数据请求和接收代码详解

这两天在做http服务端请求操作,客户端post数据到服务端后,服务端通过request.getParameter()进行请求,无法读取到数据,搜索了一下发现是因为设置为text/plain模式才导致读取不到数据

urlConn.setRequestProperty("Content-Type","text/plain; charset=utf-8"); 

若设置为以下方式,则通过request.getParameter()可以读取到数据

urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 

enctype的三种编码

form表单中enctype属性可以用来控制对表单数据的发送前的如何进行编码,即在发送到服务器之前,所有字符都会进行编码(空格转换为"+"加号,特殊符号转换为ASCIIHEX值)。默认是application/x-www-form-urlencoded。

multipart/form-data用于发送二进制的文件,其他两种类型不能用于发送文件

text/plain用于发送纯文本内容,不对特殊字符进行编码,一般用于email之类的。

application/x-www-form-urlencoded和text/plain的区别简单讲就是一个发送html内容,一个发送纯文本内容

application/x-www-form-urlencoded在发送前编码所有字符(默认)

multipart/form-data不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。

text/plain空格转换为"+"加号,但不对特殊字符编码。

当定义enctype为application/x-www-form-urlencoded时,使用以下方式接收数据

request.getParameter(参数名); 

当定义enctype为text/plain时,使用以下方式接收数据

    // 接收请求数据
    BufferedReader reader = request.getReader();
    char[] buf = new char[512];
    int len = 0;
    StringBuffer contentBuffer = new StringBuffer();
    while ((len = reader.read(buf)) != -1) {
      contentBuffer.append(buf, 0, len);
    }
        String content = contentBuffer.toString();
        
        if(content == null){
            content = "";
        }

post与get

tp请求在所有的编程语言中几乎都是支持的,我们常用的两种为:GET,POST请求。一般情况下,发送一个GET请求都很简单,因为参数直接放在请求的URL上,对于POST请求,由于其数据是在消息体中发送出去的,所以相对来说要麻烦一点,再涉及到需要发送文件等二进制的数据类型,就更需要更多的处理。

post和get可以通过键值对的方式进行参数传输,服务端通过request.getparameter方式进行请求获取数据。

客户端post数据到服务端,服务端接收处理

public class UrlConnection {
	@SuppressWarnings("finally") 
	  public static Boolean response(String url,String content) {
		String line     = "";
		String message    = "";
		String returnData  = "";
		Boolean postState   = false;
		BufferedReader bufferedReader = null;
		try {
			URL urlObject = new URL(url);
			HttpURLConnection urlConn = (HttpURLConnection) urlObject.openConnection();
			urlConn.setDoOutput(true);
			/*设定禁用缓存*/
			urlConn.setRequestProperty("Pragma:", "no-cache");
			urlConn.setRequestProperty("Cache-Control", "no-cache");
			/*维持长连接*/
			urlConn.setRequestProperty("Connection", "Keep-Alive");
			/*设置字符集*/
			urlConn.setRequestProperty("Charset", "UTF-8");
			/*设定输出格式为json*/
			urlConn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
			/*设置使用POST的方式发送*/
			urlConn.setRequestMethod("POST");
			/*设置不使用缓存*/
			urlConn.setUseCaches(false);
			/*设置容许输出*/
			urlConn.setDoOutput(true);
			/*设置容许输入*/
			urlConn.setDoInput(true);
			urlConn.connect();
			OutputStreamWriter outStreamWriter = new OutputStreamWriter(urlConn.getOutputStream(),"UTF-8");
			outStreamWriter.write(content);
			outStreamWriter.flush();
			outStreamWriter.close();
			/*若post失败*/
			if((urlConn.getResponseCode() != 200)){
				returnData = "{\"jsonStrStatus\":0,\"processResults\":[]}";
				message = "发送POST失败!"+ "code="+urlConn.getResponseCode() + "," + "失败消息:"+ urlConn.getResponseMessage();
				// 定义BufferedReader输入流来读取URL的响应 
				InputStream errorStream = urlConn.getErrorStream();
				if(errorStream != null) 
				        {
					InputStreamReader inputStreamReader = new InputStreamReader(errorStream,"utf-8");
					bufferedReader = new BufferedReader(inputStreamReader);
					while ((line = bufferedReader.readLine()) != null) {
						message += line;
					}
					inputStreamReader.close();
				}
				errorStream.close();
				System.out.println("发送失败!错误信息为:"+message);
			} else{
				/*发送成功返回发送成功状态*/
				postState = true;
				// 定义BufferedReader输入流来读取URL的响应 
				InputStream inputStream = urlConn.getInputStream();
				InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
				bufferedReader = new BufferedReader(inputStreamReader);
				while ((line = bufferedReader.readLine()) != null) {
					message += line;
				}
				returnData = message;
				inputStream.close();
				inputStreamReader.close();
				System.out.println("发送POST成功!返回内容为:" + message);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			try {
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			}
			catch (IOException ex) {
				ex.printStackTrace();
			}
			return postState;
		}
	}
	/*读取request数据*/
	public static String getRequestData(HttpServletRequest request) throws IOException{
		BufferedReader reader = request.getReader();
		char[] buf = new char[512];
		int len = 0;
		StringBuffer contentBuffer = new StringBuffer();
		while ((len = reader.read(buf)) != -1) {
			contentBuffer.append(buf, 0, len);
		}
		String content = contentBuffer.toString();
		if(content == null){
			content = "";
		}
		return content;
	}
}

总结

以上就是本文关于Java编程Post数据请求和接收代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

java线程间通信的通俗解释及代码示例

Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解

Java多线程编程实现socket通信示例代码

如有不足之处,欢迎留言指出。

解决java使用axios.js的post请求后台时无法接收到入参的问题

使用vue有一段时间了,下面是我在Java环境下使用vue+axios的时候遇到的一个坑,在这分享给大家,如有不正确或者疑惑的地方可以给我留言。

1.在使用异步请求后台时,由于官方不在更新vue-resource,推荐使用axios,因此在使用的时候难免会遇到各种问题。目前遇到最大的问题是在使用axios.post的请求向Java后端传入入参时,后端无法接收到参数。在这里主要处理移动端浏览器兼容的问题。

在这里我提供了两种解决办法:

一、URLSearchParams.append()方法

由于URLSearchParams接口在各个浏览器兼容性问题,这种方法在PC端绝大多数浏览器是OK的,但是在手机端正相反,基本上都不支持。

如图:

解决java使用axios.js的post请求后台时无法接收到入参的问题

解决java使用axios.js的post请求后台时无法接收到入参的问题

getBarCode : _ => {
   let param = new URLSearchParams();
   param.append("userName","admin");
   param.append("userPassword","admin");
   axios.post("/index.html",param)
   .then(function(response){
     console.log(response);
   })
   .catch(function(response){
     console.log(response)
   })
}

二、主要解决移动端浏览器兼容性问题

//请求后台数据之前转换入参
transformRequest: function (data) {
  let ret = ''
  for (let it in data) {
  ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
    }
  return ret
}
axios.post(url,this.transformRequest(param),{
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
        }
      }).then(function(res){
        console.log(res);
      }).catch(function(res){
        console.log(res);
      })

以上这篇解决java使用axios.js的post请求后台时无法接收到入参的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • vue中post请求以a=a&b=b的格式问题整理
  • React Native采用Fetch方式发送跨域POST请求的实例内容
  • Java Post数据请求和接收 相关电子书
    学习笔记
    网友NO.678646

    Java中BigInteger大数字运算知识点整理

    在 Java中,有许多数字处理的类,比如Integer 类。但是Integer 类有一定的局限性,下面我们就来看看比 Integer 类更厉害的一个,BigInteger类。 BigInteger类型的数字范围较 Integer 类型的数字范围要大得多。我们都知道 Integer 是 Int 的包装类,int 的最大值为 2 31 -1,如果要计算更大的数字,使用Integer 数据类型就无法实现了,所以 Java 中提供了BigInteger 类来处理更大的数字。 BigInteger 支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。 在 BigInteger类中封装了多种操作!除了基本的加减乘除操作之外,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。 使用BigInteger 类,可以实例化一个BigInteger 对象,并自动调用相应的构造函数。BigInteger 类具有很多构造函数,但最直接的一种方式是参数以……

    网友NO.265768

    JavaScript模块模式实例详解

    本文实例讲述了JavaScript模块模式。分享给大家供大家参考,具体如下: 在JS中没有Class的概念,那么如何体现Object的Public和Private属性呢,答案就是模块模式(Module Pattern)。 JS中有一个显著的特性: 匿名函数(anonymous function),通过匿名函数的建立和执行,匿名函数里的代码就形成了一个闭包(closure),从而形成,封装和控制一个对象的Private和Public的特性,避免了全局变量的泛滥和与其他脚本的冲突。 (function () { // 所有的变量和函数只在这个范围内有效 // 仍然可以使用全局变量}()); 经典的模块模式模板 var myNamespace = (function () { var myPrivateVar, myPrivateMethod; // A private counter variable myPrivateVar = 0; // A private function which logs any arguments myPrivateMethod = function( foo ) { console.log( foo ); }; return { // A public variable myPublicVar: "foo", // A public function utilizing privates myPublicFunct……

    网友NO.784169

    老生常谈javascript变量的命名规范和注释

    简单说,标识符命名规则如下: 第一个字符可以是任意Unicode字母,以及美元符号($)和下划线(_)。 第二个字符及后面的字符,还可以用数字。 下面这些都是合法的标识符。 arg0 _tmp $elem π 下面这些则是不合法的标识符。 1a 23 *** a+b -d 中文是合法的标识符,可以用作变量名。 var 临时变量 = 1; JavaScript有一些保留字,不能用作标识符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。 另外,还有三个词虽然不是保留字,但是因为具有特别含义,也不应该用作标识符:Infinity、NaN、undefined。 源码中被Jav……

    网友NO.159033

    Java中实现String.padLeft和String.padRight的示例

    因为习惯了C#中的padLeft和padRight,接触Java后突然失去这两个功能,觉得别扭,就试着实现了这两个方法。 Java中String.format()中带有字符串对齐功能如下: System.out.println(String.format("*%1$-10s*", "moon"));System.out.println(String.format("*%1$10s*", "moon")); 输出: 以上方法经过简单的变换可以得到: public static String padWhitespaceLeft(String s, int len) { return String.format("%1$" + len + "s", s);}public static String padWhitespaceRight(String s, int len) { return String.format("%1$-" + len + "s", s);} 调用下面方法: System.out.println("*" + padWhitespaceLeft("moon", 12) + "*");System.out.println("*" + padWhitespaceRight("moon", 12) + "*"); 可以得到结果: 以上只是介绍左右对齐时,补空白符的方法,但是在实际开发过程中,单纯的补空白符也许满足不了开发要求,为此我还要做一次强化改进: /** * @作者 尧 * @功能 String左对齐 */ public static Str……

    网友NO.951752

    详解Java生成PDF文档方法

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料。整理之后,发现有如下几个框架可以实现这个功能。 1. 开源框架支持 iText,生成PDF文档,还支持将XML、Html文件转化为PDF文件; Apache PDFBox,生成、合并PDF文档; docx4j,生成docx、pptx、xlsx文档,支持转换为PDF格式。 比较: iText开源协议为AGPL,而其他两个框架协议均为Apache License v2.0。 使用PDFBox生成PDF就像画图似的,文字和图像根据页面坐标画上去的,需要根据字数手动换行。 docx4j用来生成docx文档,提供了将WORD文档转换为PDF文档的功能,并不能直接生成PDF文档。 2. 实现方案 — 格式复杂 格式简单 数据量大 docx4j+freemarker docx4j或PDFBox 数据量小 docx4j PDFBox 2.1 纯数据生成PDF 1.docx4j,适用于生成格式简单或格式复杂且数据量小的PDF文档; 2.Apache PDFBox,适用于……

    <
    1
    >

    Copyright 2018-2020 www.xz577.com 码农之家

    投诉 / 推广 / 赞助:QQ:520161757