在Http请求里post是其中比较常用的提交数据的请求方式,那么接下来就给大家详细讲解下post的几种数据传输格式,以及写法。

Http的请求传输方式很多:

我们着重讲解Post方式。Post请求包含两部分:请求头(header)和请求体(body)。

Post常见的请求体(body)有三种传输内容类型Content-type:application/x-www-form-urlencoded、application/json、multipart/form-data,当然还有其他的几种,不过不常用,常用的就是这三种。

先看第一种:application/x-www-form-urlencoded。

通过Postman可以看到Post请求的参数一般放在Body里。我们的application/x-www-form-urlencoded方式也是Post请求最早支持的一种数据传输方式,这种也是key和value形式,将我们的参数类似于GET方式那样拼接成一个字符串,例如:key1=value1&key2=value2,这种形式,然后将这个参数字符串进行urlencode编码,放到Body里进行发送请求数据。

接下来分别用Java Spring MVC、Android OkHttp、Retrofit、JS Ajax、Nodejs分别演示下这种方式的请求和接口编写:

在Java的Spring MVC中默认的编写Controller接口请求数据传输就是这种方式:application/x-www-form-urlencoded。

package com.web.mvc.controller;import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.web.mvc.model.Entity;
import com.web.mvc.model.User;
import com.web.mvc.service.EntityService;
import com.web.mvc.service.IEntityService;
import com.web.mvc.utils.RedisUtils;
import com.web.mvc.utils.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;import java.io.File;
import java.io.IOException;
import java.sql.SQLException;import org.apache.commons.codec.binary.Base64;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;//@Controller
@RestController
@RequestMapping("/entity")
public class EntityController {@Autowiredprivate IEntityService entityService;//默认form-urlcoded@CrossOrigin@RequestMapping(value = "/urlcodedReq", method = RequestMethod.POST)@ResponseBodypublic String urlcodedReq(@RequestParam String name,@RequestParam String pwd) {System.out.println("urlcodedReq:" + name + "  " + pwd);Gson gson = new Gson();HashMap<String, String> map = new HashMap<>();map.put("name", name);map.put("pwd", pwd);return gson.toJson(map);}
}

@CrossOrigin:用来处理支持跨域请求的;

@ResponseBody:作用在方法上,表示请求返回的数据写入http response body里,也就是返回数据,而不是进行页面跳转。

以上就是Java Spring MVC编写Controller Post接口的写法。

接下来看下Android中Retrofit的请求写法:

public interface ApiService {//application/x-www-form-urlencoded@FormUrlEncoded@POST("urlcodedReq")Call<ResponseBody> getRepos(@Field("name") String name, @Field("pwd") String pwd);
}

就是加入了@FormUrlEncoded注解即可。

再看下Okhttp发送请求的写法:

public class Utils {private static Stringurl = "http://192.168.1.130:8086/entity/urlcodedReq";public static void okPost() {OkHttpClient client = new OkHttpClient();client.newBuilder().build();//application/x-www-form-urlencodedRequestBody body = new FormBody.Builder().add("name", "123").add("pwd", "pwd1").build();Request request = new Request.Builder().post(body).url(url).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println("onFailure:" + e.getLocalizedMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println("onResponse:" + response.body().string());}});}
}

接下来看下JS中Ajax的写法:

/*** 原生Ajax POST请求*/
function getOrigantAjaxPost() {var stringData='name=value1&pwd=value2'var oAjax = null;//这里进行HTTP请求try {oAjax = new XMLHttpRequest();} catch (e) {oAjax = new ActiveXObject("Microsoft.XMLHTTP");};//post方式oAjax.open('post', 'http://' + hostName + ':' + port + '/entity/urlReq', true);oAjax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//post发送数据oAjax.send(stringData);oAjax.onreadystatechange = function () {//当状态为4的时候,执行以下操作if (oAjax.readyState == 4 && oAjax.status == 200) {try {//+ oAjax.responseTextconsole.log('data:' + oAjax.responseText);} catch (e) {// alert('你访问的页面出错了' + e);};};};
}

Jquery Ajax写法:

function getOrigantAjaxPost() {var stringData = 'name=value1&pwd=value2'$.ajax({data: stringData,async: true,url: 'http://' + hostName + ':' + port + '/entity/urlReq',type: "post",processData: false,  //tell jQuery not to process the datacontentType: "application/x-www-form-urlencoded",success: function (data, status) {// alert("Data: " + status);console.log("Data: " + JSON.stringify(data) + "  " + status);},error: function (e) {// alert("Data: error" + JSON.stringify(e));console.log('error ' + JSON.stringify(e));}});
}

接下来再看下Nodejs的接口和请求写法:

var http = require("http");
var url = require('url');
var express = require('express')
var bodyParser = require('body-parser');
//设置主机名
var hostName = '192.168.56.1';
//设置端口
var port = 8092;
var app = express()
var urlencodedParser = bodyParser.urlencoded({ extended: false })
routes.post('/url', urlencodedParser, (req, res) => {//解析参数var params = req.body;var user = {};user.name = params.name;user.pwd = params.pwd;var response = { status: 1, data: user };res.send(JSON.stringify(response));res.end();
});

Nodejs原生写Post接口解析写法:

const http = require('http');//用http模块创建一个http服务端
http.createServer(function(req, res) {if (req.method.toLowerCase() === 'post') {var body = '';   req.on('data', function(chunk){body += chunk;});req.on('end', function(){if(req.headers['content-type'].indexOf('application/json')!==-1){// JSON 格式请求体解析JSON.parse(body);} else if(req.headers['content-type'].indexOf('application/octet-stream')!==-1){// Raw 格式请求体解析// ……} else if(req.headers['content-type'].indexOf('text/plain')!==-1){// text 文本格式请求体解析// ……} else if(req.headers['content-type'].indexOf('application/x-www-form-urlencoded')!==-1){// URL-encoded 格式请求体解析// ……} else {// 其它格式解析}})} else {res.end('其它提交方式');}
}).listen(3000);

Nodejs的请求写法:

/*** 原生POST请求*/
function urlPost() {var http = require('http');var querystring = require('querystring');var contents = querystring.stringify({name: 'nameuser',pwd: '123'});var options = {host: hostName,port: port,path: '/entity/req',method: 'POST',headers: {'Content-Type': 'application/x-www-form-urlencoded','Content-Length': contents.length}}var req = http.request(options, function (res) {res.setEncoding('utf8');res.on('data', function (data) {console.log("data:", data);//返回数据});});req.write(contents);req.end();
}

再看第二种:application/json。

application/json也就是告诉我们的服务器我们的消息体内容类型是序列化的JSON字符串,例如:{ "name": "value1", "pwd": "value2" }。获取到这个body直接解析Json格式字符串即可拿到参数数据。

接下来分别用Java Spring MVC、Android OkHttp、Retrofit、JS Ajax、Nodejs分别演示下这种方式的请求和接口编写:

在Java的Spring MVC中编写Controller接口接收解析application/json这种数据格式的需要在注解里定义consumes和produces为application/json类型。

@CrossOrigin@RequestMapping(value = "/req", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)@ResponseBodypublic String postReq(@RequestBody User user) {System.out.println("req:" + user.getName() + "  " + user.getPwd());Gson gson = new Gson();HashMap<String, String> map = new HashMap<>();map.put("name", user.getName());map.put("pwd", user.getPwd());return gson.toJson(map);}

Retrofit定义的话就是要加上@Headers注解,里面声明Content-Type即可。

//application/json@Headers({"Content-Type: application/json", "Accept: application/json"})@POST("req")Call<ResponseBody> getRepos(@Body Entity entity);

Android OkHttp使用方法如下:

public static void okPost() {OkHttpClient client = new OkHttpClient();client.newBuilder().build();//application/jsonMediaType mediaType = MediaType.parse("application/json; charset=utf-8");Gson gson = new Gson();HashMap<String, String> map = new HashMap<>();map.put("name", "name1");map.put("pwd", "pwd1");String postString = gson.toJson(map);RequestBody requestBody = RequestBody.create(mediaType, postString);Request request = new Request.Builder().post(requestBody).url(url).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println("onFailure:" + e.getLocalizedMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println("onResponse:" + response.body().string());}});}

Ajax写法:

/*** 原生Ajax POST请求*/
function getOrigantAjaxPost() {var postData = '{ "name": "value1", "pwd": "value2" }';var oAjax = null;//这里进行HTTP请求try {oAjax = new XMLHttpRequest();} catch (e) {oAjax = new ActiveXObject("Microsoft.XMLHTTP");};//post方式oAjax.open('post', 'http://' + hostName + ':' + port + '/entity/req', true);oAjax.setRequestHeader("Content-type", "application/json");//post发送数据oAjax.send(postData);oAjax.onreadystatechange = function () {//当状态为4的时候,执行以下操作if (oAjax.readyState == 4 && oAjax.status == 200) {try {//+ oAjax.responseTextconsole.log('tryForm:' + oAjax.responseText);// alert('readyState' + oAjax.status + "  "//     + oAjax.responseText);} catch (e) {// alert('你访问的页面出错了' + e);};};};
}

Jquery Ajax写法:

/*** 原生Ajax POST请求*/
function getOrigantAjaxPost() {var postData = '{ "name": "value1", "pwd": "value2" }';$.ajax({data: postData,async: true,url: 'http://' + hostName + ':' + port + '/entity/req',type: "post",processData: false,  //tell jQuery not to process the datacontentType: "application/json",  //tell jQuery not to set contentTypesuccess: function (data, status) {// alert("Data: " + status);console.log("Data: " + JSON.stringify(data) + "  " + status);},error: function (e) {// alert("Data: error" + JSON.stringify(e));console.log('error ' + JSON.stringify(e));}});
}

Nodejs的接口写法,只是变成bodyParser.json即可:

var urlencodedParser = bodyParser.json({ extended: false })
routes.post('/url', urlencodedParser, (req, res) => {//解析参数var params = req.body;var user = {};user.name = params.name;user.pwd = params.pwd;var response = { status: 1, data: user };res.send(JSON.stringify(response));res.end();
});

Nodejs请求的写法:

/*** 原生POST请求*/
function getAPost() {var http = require('http');var contents='{ "name": "value1json", "pwd": "value2" }';var options = {host: hostName,port: port,path: '/entity/req',method: 'POST',headers: {'Content-Type': 'application/json','Content-Length': contents.length}}var req = http.request(options, function (res) {res.setEncoding('utf8');res.on('data', function (data) {console.log("data:", data);//返回数据});});req.write(contents);req.end();
}

接下来看下最后一种常用的Post请求的数据格式,:multipart/form-data。

这种格式主要用来进行文件上传,当然可以作为表单内容进行键值对提交数据,各个表单项之间用boundary分开。

接下来分别用Java Spring MVC、Android OkHttp、Retrofit、JS Ajax、Nodejs分别演示下这种方式的请求和接口编写:

在Java的Spring MVC中编写Controller接口接收解析multipart/form-data这种数据格式的需要在注解里定义consumes和produces为multipart/form-data​​​​​​​类型。

@CrossOrigin@RequestMapping(value = "/upReq", method = RequestMethod.POST,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)@ResponseBodypublic String uploadReq(@RequestPart(value = "file") MultipartFile multipartFile,@RequestParam("description") String description) {String fileType = multipartFile.getContentType();String fileName = multipartFile.getOriginalFilename();File file = new File("E:/file.jpg");System.out.println("请求:" + fileType + " "+ fileName + "  " + description);try {multipartFile.transferTo(file);return "success";} catch (IOException e) {e.printStackTrace();return "failure";}}@CrossOrigin@RequestMapping(value = "/formReq", method = RequestMethod.POST,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)@ResponseBodypublic String formDataReq(@RequestParam String name,@RequestParam String pwd) {System.out.println("formReq:" + name + "  " + pwd);Gson gson = new Gson();HashMap<String, String> map = new HashMap<>();map.put("name", name);map.put("pwd", pwd);return gson.toJson(map);}

Retrofit的写法就是加上@Multipart注解,参数用@Part进行注解:

    //multipart/form-data@Multipart@POST("req")Call<ResponseBody> getRepos(@Part("description") RequestBody description,@Part MultipartBody.Part file);

Android OkHttp的写法是:

public static void okPost() {OkHttpClient client = new OkHttpClient();client.newBuilder().build();//multipart/form-dataFile file = new File("E:/img.png");RequestBody fileBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(),RequestBody.create(MediaType.parse("image/png"), file)).addFormDataPart("description", "description").build();Request request = new Request.Builder().post(fileBody).url(formUrl).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println("onFailure:" + e.getLocalizedMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println("onResponse:" + response.body().string());}});}

Ajax写法是:

/*** 原生Ajax POST请求*/
function getOrigantAjaxPost() {var oAjax = null;//这里进行HTTP请求try {oAjax = new XMLHttpRequest();} catch (e) {oAjax = new ActiveXObject("Microsoft.XMLHTTP");};var formData = new FormData();formData .append("file", file); // 文件对象formData .append("description", "description");//post方式oAjax.open('post', 'http://' + hostName + ':' + port + '/entity/formReq', true);// oAjax.setRequestHeader("Content-type", "multipart/form-data");//post发送数据oAjax.send(formData );oAjax.onreadystatechange = function () {//当状态为4的时候,执行以下操作if (oAjax.readyState == 4 && oAjax.status == 200) {try {//+ oAjax.responseTextconsole.log('tryForm:' + oAjax.responseText);// alert('readyState' + oAjax.status + "  "//     + oAjax.responseText);} catch (e) {// alert('你访问的页面出错了' + e);};};};
}

Jquery Ajax写法:

/*** 原生Ajax POST请求*/
function getOrigantAjaxPost() {var form = new FormData();form.append("file", file); // 文件对象form.append("description", "image");$.ajax({data: form,async: true,url: 'http://' + hostName + ':' + port + '/entity/formReq',type: "post",processData: false,  //tell jQuery not to process the datacontentType: "multipart/form-data",  //tell jQuery not to set contentTypesuccess: function (data, status) {// alert("Data: " + status);console.log("Data: " + data + "  " + status);},error: function (e) {// alert("Data: error" + JSON.stringify(e));console.log('error ' + JSON.stringify(e));}});
}

Nodejs接口写法,用了multipart:

var multipartMiddleware = multipart();
routes.post('/url', multipartMiddleware, (req, res) => {res.send("success:" + JSON.stringify(req.body) + " " + req.files.file.type);res.end();
});

Nodejs请求写法:

/*** 原生POST请求*/
function getAPost() {var http = require('http');var formData = new FormData();formData.append('file', fs.createReadStream("./filename.zip"));formData.append('description', 'image');var options = {host: hostName,port: port,path: '/entity/req',method: 'POST',headers: {'Content-Type': 'multipart/form-data',}}var req = http.request(options, function (res) {res.setEncoding('utf8');res.on('data', function (data) {console.log("data:", data);//返回数据});});req.write(formData);req.end();
}

以上就是给大家介绍的主流Http Post的数据传输格式在各个语言上的用法。

详解http post请求的几种数据传输方式相关推荐

  1. java 数组合并_拼接_详解Java合并数组的两种实现方式

    详解Java合并数组的两种实现方式 发布于 2020-7-27| 复制链接 摘记: 最近在写代码时遇到了需要合并两个数组的需求,突然发现以前没用过,于是研究了一下合并数组的方式,总结如下.1.Syst ...

  2. 详解mysql备份恢复的三种实现方式

    一.Mysql备份策略: 完整备份: 完整备份就是指对某一个时间点上的所有数据或应用进行的一个完整拷贝,对数据量大的,备份时间较长,当然数据在恢复的时候快. 增量备份: 备份自上一次备份(包括完整备份 ...

  3. android编程fragment,详解Android中Fragment的两种创建方式

    onCreate():在创建fragment时系统会调用此方法.在实现代码中,你可以初始化想要在fragment中保持的那些必要组件,当fragment处于暂停或者停止状态之后可重新启用它们. onC ...

  4. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  5. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

  6. vue路由跳转写法在html,详解vue 路由跳转四种方式 (带参数)

    1.  router-link 1. 不带参数 //name,path都行, 建议用name // 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由 ...

  7. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

  8. python可以播放音乐吗_详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  9. python如何安装matplotlib_详解python安装matplotlib库三种失败情况

    (可能只有最后一句命令有用,可能全篇都没用) (小白方法,可能只适用于本人情况) 安装matplotlib时,出现的三种失败情况 1.read timed out 一开始我在pycharm终端使用pi ...

最新文章

  1. python强大体现在哪些方面-大公司里哪些方面运用了python?
  2. 网站后台管理界面设计的一些想法
  3. 如何分配和释放存储空间
  4. HTML学习03之列表,表格,媒体元素
  5. 【Java】基数排序
  6. ctf 抓捕赵德汉_2017年网络空间安全技术大赛部分writeup
  7. php dump函数详解,php中var_dump()函数的详解说明
  8. 系统学习机器学习之参数方法(三)
  9. 教你视频去色效果怎么操作
  10. (转自MBA智库百科)弗兰克·吉尔布雷斯
  11. xp系统打印机服务器win7连接不了,Win7无法共享xp打印机的解决方法
  12. 【WINRAR安装和使用教程】常用压缩软件
  13. 几款常见的可视化HTML编辑器(WYSIWYG)
  14. html显示百度热搜,Python获取百度热搜的完整代码
  15. Notepad++添加读取十六进制插件HexEditor
  16. 概率论_证明_辛钦大数定律
  17. 促使新网站快速增加百度收录的几个不外传技巧
  18. b460m迫击炮黑苹果_打造十代i5ES极致性价比黑苹果主机
  19. 三种查看文件MD5 SHA*等校验值的方法
  20. 【论文阅读】PAIRWISE LINKAGE FOR POINT CLOUD SEGMENTATION-ISPRS-luxiaohu

热门文章

  1. yepnope.js教程
  2. 十大经典排序算法-桶排序算法详解
  3. 转: C++ 中 ZeroMemory、memset 易内存出错
  4. Ubuntu1804安装pdf阅读软件
  5. 罗氏、GSK、波士顿科学、益普生、德国默克、Abcam、Wugen等公司新动态 | 跨国药企在中国...
  6. frida hook嘟嘟牛在线
  7. python fork_Python 中fork()理解
  8. ionic3 Bug收集
  9. 详解CreateFile函数
  10. windows update更新返回错误码统计(WUSA.exe)