精华内容
下载资源
问答
  • application/json 四种常见的 POST 提交数据方式

    万次阅读 多人点赞 2018-11-13 16:00:11
    application/json 四种常见的 POST 提交数据方式 转载声明: 本文系转载自以下两篇文章: 四种常见的 POST 提交数据方式 作者: 沧海一滴 转载仅为方便学习查看,一切权利属于原作者,本人只是做了整理和排版,...

    application/json 四种常见的 POST 提交数据方式

    转载声明:

    本文系转载自以下两篇文章:

    转载仅为方便学习查看,一切权利属于原作者,本人只是做了整理和排版,如果带来不便请联系我删除。

    0x01 摘要

    enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
    默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。

    enctype可选项如下:

    描述
    application/x-www-form-urlencoded在发送前编码所有字符(默认)
    multipart/form-data不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
    application/json作为请求头告诉服务端消息主体是序列化的JSON字符串。除低版本的IE,基本都支持。
    text/plain空格转换为 “+” 加号,但不对特殊字符编码。

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONSGETHEADPOSTPUTDELETETRACECONNECT这几种。

    其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。

    HTTP 协议是以 ASCII 码传输。他是建立在 TCP/IP 协议之上的应用层规范, 规定HTTP 请求分为三个部分:

    • 状态行
    • headers 请求头
    • entity-body 消息主体

    类似于下面这样:

    <method> <request-URL> <version>
    <headers>
    
    <entity-body>
    

    HTTP Headers
    HTTP协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

    但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以 POST 提交数据包含了 Content-Type 和消息主体编码方式两部分,下面就正式开始介绍它们。

    0x02 application/x-www-form-urlencoded

    2.1 简介

    HTTP中默认的提交数据的方式。

    浏览器的原生 <form>表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

    POST http://www.example.com HTTP/1.1
    Content-Type: application/x-www-form-urlencoded;charset=utf-8
     
    title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
    

    通过抓包结果我们能得到以下结论:

    • Content-Type 被指定为 application/x-www-form-urlencoded
    • 提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。

    很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax 默认的Content-Type 值都是「application/x-www-form-urlencoded;charset=utf-8」。

    2.2 Spring中设置-@RequestParam

    Spring中可用@RequestParam(非必须,也可以不加)来处理Content-Typeapplication/x-www-form-urlencoded数据,修饰的对象可以是基本数据类型和自定义对象。

    @RequestParam的原理是SpringRequest.getParameter()中的Key-Value参数Map转化成了参数@RequestParam修饰的基本类型数据或对象。

    @RequestParam同时适用于get和post,只要Content-Typeapplication/x-www-form-urlencoded

    @RequestParam可使用required属性来指定某个字段是否必须有值。

    @RequestParam可使用value属性来绑定原始请求参数名,后面跟本方法里字段名,如@RequestParam(required = false, value = "user")String username就是把user请求参数映射到我们定义的username,方便使用。

    注意:使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中

    2.3 Spring不加@RequestParam

    在不需要时,也可不使用@RequestParam,仅在方法内定义对应字段名,如

    @RequestMapping(value = "/adhoc/explainSqlV12", produces ="application/json; charset=utf-8")
    @ResponseBody
     public Map<String,Object> adhocExplainSqlV12(String user,
                                                 String query,
                                                 String cluster,
                                                 String token)
    

    此时仍能读到这些请求参数的值,具体原理可参考关于SpringMvc使用时,不加@RequestParam注解,根据方法形参名也可以获取请求值的分析

    2.4 Servlet-HttpServletRequest

    也可以直接使用HttpServletRequest来获取参数

    @RequestMapping(value = "/adhoc/explainSqlV42", produces ="application/json; charset=utf-8")
    @ResponseBody
     public Map<String,Object> adhocExplainSqlV42(HttpServletRequest request,
                                                 HttpServletResponse response) {
         Map<String, Object> result = new HashMap<>();
         try {
             String user = ServletRequestUtils.getStringParameter(request, "user");
             String query = request.getParameter("query");
             String cluster = request.getParameter("cluster");
             logger.info("user={}, query={}, cluster={}", user, query, cluster);
         } catch (ServletRequestBindingException e) {
             e.printStackTrace();
         }
         return result;
     }
    

    0x03 multipart/form-data

    3.1 简介

    一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须将 的 enctype设为 multipart/form-data

    注意:以上两种方式:application/x-www-form-urlencodedmultipart/form-data都是浏览器原生支持的。

    3.2 Spring中设置

    可以使用@RequestPart处理接收到的文件。

    示例如下:

    /**
         * 单文件上传
         * @param file
         * @param bucket
         * @return
         */
        @RequestMapping("uploadFile")
        public JsonResult uploadFile(@RequestPart("file") MultipartFile file, @RequestParam String bucket){
    
            String fileUrl = aliossService.uploadFile(file, bucket);
            Map<String,String> result = new HashMap<>();
            result.put("fileUrl",fileUrl);
    
            return success(result);
        }
    

    0x04 application/json

    4.1 简介

    application/json作为请求头,用来告诉服务端消息主体是序列化的JSON字符串,除了低版本的IE,基本都支持。服务端有处理JSON的函数,使用不会有任何麻烦。

    Google 的 AngularJS 中的 Ajax 功能,默认就是application/json。例如下面这段代码:

    JSvar data = {'title':'test', 'sub' : [1,2,3]};
    $http.post(url, data).success(function(result) {
        ...
    });
    

    最终发送的请求是:

    BASHPOST http://www.example.com HTTP/1.1 
    Content-Type: application/json;charset=utf-8
    
    {"title":"test","sub":[1,2,3]}
    

    4.2 Spring中设置-@RequestBody

    4.2.1 原理

    • GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
    • POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-TypeSpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到@RequestBody修饰的对象上。
    • @RequestBody 也可以处理 application/xml
    • @RequestBody可以和@RequestParam联合使用,但是不建议这么做,具体做法可以点这里

    4.2.2 示例

    在springMVC中,可以用以下方式指定参数的格式为application/json

    • 接收
      注意接收时必须用@RequestBody来修饰接收到的post body内的对象。
    @RequestMapping(value = "/kill_query", method = RequestMethod.POST, consumes = "application/json; charset=utf-8")
        public ResponseEntity<String> killQuery(@RequestBody User user){} 
    
    • 发送
    @RequestMapping(value = "/user/{userId}", method = RequestMethod.GET, produces="application/json")  
    @ResponseBody  
    public User getUser(@PathVariable String UserId, Model model) {}  
    

    4.3 小结

    application/json 可以方便的提交复杂的结构化数据,特别适合 RESTFul 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。

    0x05 text/xml

    我的博客之前提到过 XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:

    POST http://www.example.com HTTP/1.1 
    Content-Type: text/xml
    
    <?xml version="1.0"?>
    <methodCall>
        <methodName>examples.getStateName</methodName>
        <params>
            <param>
                <value><i4>41</i4></value>
            </param>
        </params>
    </methodCall>
    

    XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。

    0xFF 参考文档

    四种常见的 POST 提交数据方式
    四种常见的 POST 提交数据方式+整理postman

    关于更多信息,可以查看这篇文章:Http请求中Content-Type讲解以及在Spring MVC注解中produce和consumes配置详解

    展开全文
  • 1,Webbrowser截获POST数据 void __stdcall CBrowserWeb::OnBeforeNavigate2(IDispatch *pDisp, VARIANT *url, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *Post...

    1,Webbrowser截获POST数据

    void __stdcall CBrowserWeb::OnBeforeNavigate2(IDispatch *pDisp,
    								 	VARIANT *url,
    								 	VARIANT *Flags,
    									VARIANT *TargetFrameName,
    									VARIANT *PostData,
    									VARIANT *Headers,
    									VARIANT_BOOL *Cancel
    									)
    {
    	ATLASSERT(m_spWebBrowser2);
    
            /* 别的代码 */	
    
    	/* 以下此段为以字符串形式查看提交的POST数据*/
    	if( PostData && PostData->vt == (VT_VARIANT|VT_BYREF) && PostData->pvarVal->vt != VT_EMPTY)
    	{
    		//Cancel=VARIANT_TRUE;
    		char *szTemp = NULL, *szPostData = NULL;
    		long plLbound, plUbound;
    
    		SAFEARRAY *parrTemp = PostData -> pvarVal->parray;
    		SafeArrayAccessData(parrTemp , (void HUGEP **) &szTemp);
    
    		SafeArrayGetLBound(parrTemp , 1, &plLbound);
    		SafeArrayGetUBound(parrTemp , 1, &plUbound);
    
    		szPostData = new char[plUbound - plLbound + 2];
    		StrCpyA(szPostData, szTemp);//, plUbound - plLbound + 1);
    
    		szPostData[plUbound-plLbound] = '\0';
    		SafeArrayUnaccessData(parrTemp);
    		Memo1->Lines->Add(szPostData);
    
    		delete[] szPostData;
    	}
    }
    
    

     

    2,Webbrowser模拟POST提交数据,自己封装的Navigate2,直接调用此函数即可

    HRESULT   CBrowserWeb::Navigate2(LPCSTR  szUrl,LPCSTR  szPostData)   
    {   
    	HRESULT hr;
            string strHeaders = "Content-Type: application/x-www-form-urlencoded\r\n";
    
    	CComBSTR bstrURL(szUrl); 
    
    	CComVariant vHeaders;
    	vHeaders.vt = VT_BSTR;
    	vHeaders.bstrVal = SysAllocString(CComBSTR(strHeaders.c_str()).Detach());
    
    	CComVariant vFlags;
    	vFlags.vt = VT_I4;
    	vFlags.lVal = navNoReadFromCache | navNoWriteToCache; 
    
    	CComVariant vTargetFrameName;
    	//加上下面这段浏览器就会在一个新的窗口打开页面,几个参数都试过,
    	//效果都一样,还没清楚是什么原因。 
    	vTargetFrameName.vt = VT_BSTR;
    	vTargetFrameName.bstrVal= SysAllocString(L"resultFrame");
    
    	CComVariant vPostData;
    	GetPostData(vPostData,szPostData);
    	::Navigate(m_spWebBrowser2,bstrURL,   &vFlags,   
    		&vTargetFrameName,   &vPostData,   &vHeaders);   
    
    	return   TRUE;   
    } 
     
    HRESULT   CBrowserWeb::GetPostData(CComVariant &vPostData,LPCSTR  szPostData)   
    {   
    	HRESULT   hr;   
    	LPSAFEARRAY   psa; 
    	psa   =   SafeArrayCreateVector(VT_UI1,   0,   strlen(szPostData));   
    	if   (!psa)    {   
    		return   E_OUTOFMEMORY;   
    	}
    	LPSTR pPostData;
    	hr   =   SafeArrayAccessData(psa,   (LPVOID*)&pPostData);   
    	memcpy(pPostData,   szPostData,    strlen(szPostData));   
    	hr   =   SafeArrayUnaccessData(psa);
    
    	vPostData.vt =   VT_ARRAY   |   VT_UI1;     
    	vPostData.parray =  psa; 
    	return   S_OK; 
    }
    


     

    展开全文
  • POST数据加密

    万次阅读 2015-07-28 15:47:21
    数据加密: GET请求和POST请求其中之一的区别:GET请求参数直接加在请求路径后面,很不安全;...所以一定要使用POST请求提交用户的隐私数据 ...仅仅用POST请求提交用户的隐私数据,还是不能完全解

    数据加密:


    GET请求和POST请求其中之一的区别:GET请求参数直接加在请求路径后面,很不安全;

    所以一定要使用POST请求提交用户的隐私数据

    1GET请求的所有参数都是直接暴露在URL

    2,请求的URL一般会记录在服务器的访问日志中

    3,服务器的访问日志是黑客攻击的重点对象之一


    仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题:

    可以利用软件(比如Charies)设置代理服务器,拦截查看手机的请求数据,因此:提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交;

    常见的加密算法:MD5/SHA/DES/RC4/RSA/DSA/IDEA/AES等等;


    我们这里介绍下,MD5

    什么是MD5

    1,全称是Message Digest Algorithm 5,译为消息摘要算法第5

    2,效果: 对输入信息生成唯一的128位散列值(32个字符)


    MD5的特点:

    1,输入两个不同的明文不会得到相同的输出值

    2,根据输出值,不能得到原始的明文,即其过程不可逆


    MD5的应用:

    1,由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用

    2,主要运用在数字签名、文件完整性验证以及口令加密等方面

    MD5解密网站 http://www.cmd5.com

    展开全文
  • 如何用chrome查看表单post提交的数据

    千次阅读 2019-12-08 13:23:56
    例如PUST提交表单后,想查看提交的内容, 用在在客户端上包装数据 F12-Network-Headers拉到最下边可以看见username=zhang&password=1 拉到下边点击viewsource 可以看见提交的post数据 ...

    例如PUST提交表单后,想查看提交的内容, 获取数据主要是可以用在客户端上包装post数据体等

    在这里插入图片描述
    F12-Network-Headers拉到最下边可以看见username=zhang&password=1
    在这里插入图片描述

    拉到下边点击viewsource
    在这里插入图片描述
    可以看见提交的post数据
    在这里插入图片描述

    展开全文
  • 如何用chrome查看提交的post表单数据

    万次阅读 2017-10-23 00:05:32
    网上找了很多, 不过大多都是单纯文字说明的. 很多萌新一下子可能有点摸不着头脑. 在这里用图片说一下 简单来说, 在chrome里面按F12, 然后选择Network--headers,然后往下拉就可以看到啦
  • NanoHTTPD接收post数据

    千次阅读 2018-04-21 14:22:43
    在github搜索NanoHTTPD,添加依赖jar包即可(这里用的是2.3.2版本的)接收get方法传过来的数据比较简单,网上搜一下很多这里要说的是怎么接收post传过来的json数据?网上搜了一下也有很多,但是有很多坑我实现的接收方法:...
  • 在线支付post数据跳转到银行支付页面,怎么来保证post的数据不被篡改? 麻烦给个思路,非常感谢
  • 点击GET请求 点击POST请求
  • SpringBoot http post请求数据大小设置

    万次阅读 2019-06-17 17:53:22
    背景: ...的方法获取参数的值,当数据量超过几百k的时候,接口接收不到数据或者接收为null。 @RequestMapping(value = "/rcv",method = RequestMethod.POST) public ResInfo<String> pullA...
  • get和post获取数据的方式

    千次阅读 2018-03-29 14:29:44
    1、获取 get 请求提交的数据 当发生GET请求的时候,可以通过 request.GET['名称']的方式来获取 请求提交的数据 2、POST 获取数据 if request.method == 'POST': if 'name' in request.POST and request.POST['...
  • 【http postpost传输数据大小

    千次阅读 2020-05-07 14:19:27
    之前知道get请求对url请求长度有限制,post请求没有限制。今天在做程序的时候遇到了这个问题。 场景:我需要将前端生成的Svg图片转化base64生成字符串传入后台,后台根据字符串解码生成到PPT里面。 附:前端将svg...
  • POST提交数据太大

    万次阅读 2016-07-28 13:54:58
    POST数据按道理说是没有大小限制的,只是取决于浏览器或服务器的配置,tomcat的解决方式参考方案2.------------------分割线------------------------场景:之前帮客户做...
  • 并将post及get方法进行了封装,能够比较简单的调用。这里发出我自己写的源码。 在文件里面,数据的抓取为正则表达式方式抓取数据 实现的方式有。 1.根据文件中出现的字符进行抓取。 2。可以抓取前后2端的中间数据 3...
  • PHP接收POST数据方式

    万次阅读 2017-04-01 17:52:43
    但有些情况下,如用户使用客户端软件向服务端php程序发送post数据,而不能用$_POST来识别,那又该如何处理呢?我们介绍php接受post数据的三种方式:1.$_POST方式接收数据$_POST方式是通过 HTTP POST 方法传递的变量...
  • scrapy爬取post数据

    万次阅读 2016-04-27 21:25:44
    可以判断出该网页的数据都是post方式上传的。 说一下get和post的区别: get显式的传参,而post是隐式的。 get的URL会有限制,而post没有。 get没有post安全。 不过,小某还看到一篇内容。点击打开
  • 获取POST数据

    千次阅读 2012-07-08 00:38:07
    cgi程序处理post、get方式的数据 如果页面的FOMR中的METHOD属性值是GET,CGI程序就从环境变量QUERY_STRING中获取Form数 据;若METHOD属性值是POST,CGI程序就从标准输入(stdin)中获取Form数据。 /* 从环境...
  • php读取post数据解析

    千次阅读 2017-06-10 20:23:55
    https://my.oschina.net/u/205403/blog/325595 ... 对比网址 ...一、PHP获取POST数据的几种方法 方法1、最常见的方法是:$_POST['fieldname']; 说明:只能接收Content-Type: application/x
  • iPhone http Post数据

    万次阅读 多人点赞 2011-07-17 00:35:57
    iPhone 使用http协议向web服务器post数据
  • php curl 使用post发送数据

    千次阅读 2018-08-07 15:59:36
    如果我们是要发送POST数据怎么办?又需要使用curl帮我们来发送数据。 按照步骤我们自定义了一个函数,函数名为:post。post这个方法中需要传入两个参数:  1.请求的URL地址  2.发送的数据 发送的数据全为数组...
  • GET和POST提交数据方式的区别和使用

    万次阅读 2016-07-08 15:29:56
    数据提交到服务器一般有两种方式,GET和POST。 GET的优点: 1.执行效率比POST高。 2.可以通过url传递数据,查找数据的时候就会体现到它的好处。 GET的缺点: 1.安全性很低,因为上传的数据都会显示在url上,所以...
  • OkHttp Post提交json数据

    万次阅读 2019-01-25 09:54:53
    Request request = new Request.Builder() .url(NetUtil.saveEngRefundInfo()) .post(requestBody) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call...
  • flask表单post数据

    千次阅读 2017-09-12 15:00:46
    最简单的方法 @app.route('/custom', methods=['GET', 'POST']) def custom(): if request.method == 'POST': time = request.form.get('time') ...
  • curl post json数据

    千次阅读 2018-07-20 09:36:15
    curl -X POST \ http://domaim.com \ -H 'Content-Type: application/json' \ -d '{ "authentication": { "dspId": "1111", "token": "xxxxxx" }, &...
  • php无法接收post数据

    千次阅读 2016-06-29 17:12:08
    看nginx日志发现java确实有post数据。于是写了两个程序测试,发现php $_POST需要有key才能接收到数据。java 客户端例子:import java.io.BufferedReader; import java.io.IOException; import java.io....
  • post提交数据返回404错误

    千次阅读 2018-03-05 17:18:11
    使用post提交数据,发现无法执行success函数,后台的代码也正常执行了,但是就是无法执行success函数,执行error函数,我在MainConfig中做了一个映射js代码:实在是看不出哪里错了 ,求大神指点...
  • POST提交数据时四种常见的数据格式

    千次阅读 2018-09-28 14:24:03
    最近项目部署到新环境tomcat+mysql,想看看项目部署成功没有,就用soupui调对应接口开测试,soupui使用比较简单,给上接口地址,入参xml报文,把入参的media Type设置...后来问组里高手才知道post请求的入参数据格式...
  • C#获取get数据和post数据

    千次阅读 热门讨论 2018-08-09 17:06:15
    一、C#获取get数据,网页  private string GetData(string url)  {  HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);  myRequest.Method = "GET"; ...
  • PHP对接Java使用curl post发送数据

    千次阅读 2018-06-27 18:39:44
    今天遇到一点小坑需要与java对接,以数据流的形式发送 ^_^ 发送数据只要是字符串... * curl post java对接 传输数据流 * */ public function curlPost($Url, $data){ $ch = curl_init($Url); curl_setopt($ch...
  • 我的servlet可以接收到post传输过来的数据,接收完成之后我放到一个内存队列中, 我要怎样才可以在tomcat不关停的情况下, 让servlet不接收数据,从而只处理我内存队列中的数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,169,701
精华内容 467,880
关键字:

post怎么查看数据