Post请求的3种编码格式:application/x-www-form

一、前端表单提交时 /x-www-form-
表单代码:

First name:
Last name:

通过测试发现可以正常访问接口 , 在的开发者工具中可以看出 , 表单上传编码格式为/x-www-form-( 中) , 参数的格式为key=value&key=value 。
Post请求的3种编码格式:application/x-www-form

文章插图
我们可以看出 , 服务器知道参数用符号&间隔 , 如果参数值中需要& , 则必须对其进行编码 。编码格式就是/x-www-form-(将键值对的参数用&连接起来 , 如果有空格 , 将空格转换为+加号;有特殊符号 , 将特殊符号转换为ASCII HEX值) 。
/x-www-form-是浏览器默认的编码格式 。对于Get请求 , 是将参数转换?key=value&key=value格式 , 连接到url后
ps:可以在这个网址测试表单:
/form-data
那么当服务器使用/form-data接收POST请求时 , 服务器怎么知道每个参数的开始位置和结束位置呢?
First name:
Last name:

我们在开发者工具中可以看出/form-data不会对参数编码 , 使用的(分割线) , 相当于& , 的值是----Web**AJv3 。
Post请求的3种编码格式:application/x-www-form

文章插图
文件上传
Post请求的3种编码格式:application/x-www-form

文章插图
上传文件也要指定编码格式为/form-data 。

【Post请求的3种编码格式:application/x-www-form】如果是项目 , 要服务器能接受/form-data类型参数 , 还要在上下文配置以下内容 , 项目则不需要 。

我们可以通过对象模拟表单提交 , 用原始的来发送数据 , 让我们可以在开发工具中查看到具体格式:
First name:
Last name:


格式如下:
Post请求的3种编码格式:application/x-www-form

文章插图
二、调用接口代码时
1、在代码中使用/x-www-form-编码格式设置属性调用接口 , 可以如下实现:
private static String doPost(String strUrl, String content) {String result = "";try {URL url = new URL(strUrl);//通过调用url.openConnection()来获得一个新的URLConnection对象 , 并且将其结果强制转换为HttpURLConnection.HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setRequestMethod("POST");//设置连接的超时值为30000毫秒 , 超时将抛出SocketTimeoutException异常urlConnection.setConnectTimeout(30000);//设置读取的超时值为30000毫秒 , 超时将抛出SocketTimeoutException异常urlConnection.setReadTimeout(30000);//将url连接用于输出 , 这样才能使用getOutputStream() 。getOutputStream()返回的输出流用于传输数据urlConnection.setDoOutput(true);//设置通用请求属性为默认浏览器编码类型urlConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded");//getOutputStream()返回的输出流 , 用于写入参数数据 。OutputStream outputStream = urlConnection.getOutputStream();outputStream.write(content.getBytes());outputStream.flush();outputStream.close();//此时将调用接口方法 。getInputStream()返回的输入流可以读取返回的数据 。InputStream inputStream = urlConnection.getInputStream();byte[] data = http://www.kingceram.com/post/new byte[1024];StringBuilder sb = new StringBuilder();//inputStream每次就会将读取1024个byte到data中 , 当inputSteam中没有数据时 , inputStream.read(data)值为-1while (inputStream.read(data) != -1) {String s = new String(data, Charset.forName("utf-8"));sb.append(s);}result = sb.toString();inputStream.close();} catch (IOException e) {e.printStackTrace();}return result;}public static void main(String[] args) {String str = doPost("http://localhost:8888/task/", "firstName=Mickey%26&lastName=Mouse ");System.out.println(str);}