如何POST一个json post请求格式格式的数据给Restful服务

查看: 3483|回复: 3
HTTP四种常见的POST提交数据方式
阅读权限200
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。
我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
&method& &request-url& &version&
&headers&
&entity-body&&/entity-body&&/headers&&/version&&/request-url&&/method&复制代码
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。下面就正式开始介绍它们。
application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):
HTTP/1.1
Content-Type: application/x-www-form-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 转码。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,$_POST['title'] 可以获取到 title 的值,$_POST['sub'] 可以得到 sub 数组。
很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-charset=utf-8」。
multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。直接来看一个请求示例:
HTTP/1.1
Content-Type:multipart/form- boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form- name=&text&
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form- name=&file&; filename=&chrome.png&
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--复制代码
这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。关于 mutipart/form-data 的详细定义,请前往 rfc1867 查看。
这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。
上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。
application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。
Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码:
var data = {'title':'test', 'sub' : [1,2,3]};
$http.post(url, data).success(function(result) {
& & ...
});复制代码
最终发送的请求是:
HTTP/1.1
Content-Type: application/charset=utf-8
{&title&:&test&,&sub&:[1,2,3]}复制代码
这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,从 php://input 里获得原始输入流,再 json_decode 成对象。一些 php 框架已经开始这么做了。
当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。如有需要,可以参考这篇文章。
我之前提到过 XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:
HTTP/1.1
Content-Type: text/xml
&!--?xml version=&1.0&?--&
&methodcall&
& & &methodname&examples.getStateName&/methodname&
& & &params&
& && &&&&param&
& && && && &&value&&i4&41&/i4&&/value&
& && && &
& & &/params&
&/methodcall&复制代码
XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限90
希望老大能在教程里加入,解析JSON的,还是就是如何修改发送的,就是伪造的HTTP数据包,貌似还有一个就是HTTP的MFC类函数里有个函数有个BUG,不能获取到所有的服务器发给本地的COOKIE。对了,要是有对付验证码的就好了,现在发贴,没有验证码的已经基本没有了。。
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限90
发现SYC 就是牛!!!!!!!!!!!!!!!!!!! 讲的 比那些易语言的教程强万万
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
注册会员, 积分 62, 距离下一级还需 88 积分
重复下载连续扣积分,这是BUG啊。
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
站长提醒 /1
为了能给广大编程爱好者提供一个更好的学习交流平台,从即日起面向广大网友特举办《发原创得奖励》活动。Vip教程,驿站U盘,无线鼠标 免费送,礼品丰厚,赶快来参加吧!
VC驿站微信公众号cctry2009
Powered by Discuz! X3.3Restful接口规则(完整)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Restful接口规则(完整)
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩21页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢完java如何通过http post请求传递json参数到restful webservice服务接口获取数据?
java后台要使用http restful调用webservice接口获取数据,代码要怎么写啊?
所有回答列表(2)
import commons.weibo4j.util.URLEncodeU
import org.apache.http.HttpR
import org.apache.http.HttpS
import org.apache.http.HttpV
import org.apache.http.NameValueP
import org.apache.http.client.ClientProtocolE
import org.apache.http.client.HttpC
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpP
import org.apache.http.conn.ClientConnectionM
import org.apache.http.conn.params.ConnManagerP
import org.apache.http.conn.scheme.PlainSocketF
import org.apache.http.conn.scheme.S
import org.apache.http.conn.scheme.SchemeR
import org.apache.http.conn.ssl.SSLSocketF
import org.apache.http.conn.ssl.X509HostnameV
import org.apache.http.entity.StringE
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnM
import org.apache.http.params.BasicHttpP
import org.apache.http.params.HttpConnectionP
import org.apache.http.params.HttpP
import org.apache.http.params.HttpProtocolP
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityU
import javax.net.ssl.*;
import java.io.IOE
import java.io.UnsupportedEncodingE
import java.net.URLD
import java.net.URLE
import java.security.KeyManagementE
import java.security.NoSuchAlgorithmE
import java.security.cert.CertificateE
import java.security.cert.X509C
import java.util.HashM
import java.util.L
import java.util.M
import java.util.Map.E
&* 网络请求工具
&* @author Haner
public class HttpUtil {
& & private static HttpClient httpClient =
& & private static HttpGet httpG
& & private static HttpPost httpP
& & public static String TIME_OUT = &请求超时&;
& & public static String SERVER_ERROR = &服务器异常&;
& & public static String NETWORK_ERROR = &网络异常&;
& & static {
& & & & & & httpClient = getHttpClient();
& & &* Http Get请求 请求地址
& & &* @param url & &Get参数
& & &* @param params 编码
& & &* @param encode 返回请求结果
& & &* @return
& & &* @throws org.apache.http.client.ClientProtocolException
& & &* @throws java.io.IOException
& & public static String sendGetRequest(String url, Map&String, String& params,
& & & & & & & & & & & & & & & & & & & & String encode) {
& & & & String result =
& & & & try {
& & & & & & if (null == params) {
& & & & & & & & httpGet = new HttpGet(url);
& & & & & & } else {
& & & & & & & & httpGet = new HttpGet(url + dealGetParams(params, encode));
& & & & & & }
& & & & & & HttpResponse response = httpClient.execute(httpGet);
& & & & & & if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
& & & & & & & & result = EntityUtils.toString(response.getEntity());
& & & & & & }
& & & & } catch (ClientProtocolException e) {
& & & & & & e.printStackTrace();
& & & & } catch (IOException e) {
& & & & & & e.printStackTrace();
& & & & return result != null ? result : &&;
& & public static String sendGetRequest(String url, Map&String, String& params)
& & & & & & throws ClientProtocolException, IOException {
& & & & return sendGetRequest(url, params, &UTF-8&);
& & public static String sendGetRequest(String url)
& & & & & & throws ClientProtocolException, IOException {
& & & & return sendGetRequest(url, null, &UTF-8&);
& & public static String sendGetRequestGB2312(String url)
& & & & & & throws ClientProtocolException, IOException {
& & & & return sendGetRequest(url, null, &GB2312&);
& & &* POST请求 返回请求结果 HashMap键值参数
& & &* @param params
& & &* @return
& & &* @throws Exception
& & @SuppressWarnings({&deprecation&, &unchecked&})
& & public static String sendPostRequest(String url, Object params, String encode) throws Exception {
& & & & String resultStr =
& & & & httpPost = new HttpPost(url);
& & & & if (params != null) {
& & & & & & StringE
& & & & & & if (params instanceof Map) {
& & & & & & & & entity = new StringEntity(dealPostParams(
& & & & & & & & & & & & (HashMap&String, String&) params, encode));
& & & & & & } else if (params instanceof String) {
& & & & & & & & entity = new StringEntity((String) params, encode);
& & & & & & } else if (params instanceof List) {
& & & & & & & & entity = new UrlEncodedFormEntity(
& & & & & & & & & & & & (List&? extends NameValuePair&) params, encode);
& & & & & & } else {
& & & & & & & & throw new Exception(&参数有误!&);
& & & & & & }
// & & & & & &httpPost.setHeader(&Authorization&,&Bearer access_token&);
& & & & & & httpPost.setEntity(entity);
& & & & try {
& & & & & & HttpResponse response = httpClient.execute(httpPost);
& & & & & & if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
& & & & & & & & resultStr = EntityUtils.toString(response.getEntity());
& & & & & & }
& & & & } catch (ClientProtocolException e) {
& & & & & & e.printStackTrace();
& & & & } catch (IOException e) {
& & & & & & e.printStackTrace();
& & & & return resultStr != null ? resultStr :
& & public static String sendPostRequest(String url) throws Exception {
& & & & return sendPostRequest(url,&&);
& & &* 键值对请求 默认UTF-8编码
& & &* @param url
& & &* @param params
& & &* @return
& & &* @throws Exception
& & public static String sendPostRequest(String url, Map&String, String& params)
& & & & & & throws Exception {
& & & & return sendPostRequest(url, params, &UTF-8&);
& & &* String 默认UTF-8编码
& & &* @param url
& & &* @param params
& & &* @return
& & &* @throws Exception
& & public static String sendPostRequest(String url, String params)
& & & & & & throws Exception {
& & & & return sendPostRequest(url, params==null?null:params, &UTF-8&);
& & &* 键值对请求 默认UTF-8编码
& & &* @param url
& & &* @param params
& & &* @return
& & &* @throws Exception
& & public static String sendPostRequest(String url, List&NameValuePair& params)
& & & & & & throws Exception {
& & & & return sendPostRequest(url, params, &UTF-8&);
& & &* 处理Get方式请求的URL
& & &* @param params
& & &* @param enc
& & &* @return
& & &* @throws java.io.UnsupportedEncodingException
& & private static String dealGetParams(Map&String, String& params, String enc)
& & & & & & throws UnsupportedEncodingException {
& & & & StringBuffer sb = new StringBuffer();
& & & & sb.append(&?&);
& & & & for (Entry&String, String& entry : params.entrySet()) {
& & & & & & // 参数名=参数&参数名=参数
& & & & & & sb.append(entry.getKey()).append(&=&)
& & & & & & & & & & .append(URLEncoder.encode(entry.getValue(), enc))
& & & & & & & & & & .append(&&&);
& & & & // 删除最后一个&
& & & & sb.deleteCharAt(sb.length() - 1);
& & & & return sb.toString();
& & &* 处理POST请求URL
& & &* @param params
& & &* @param enc
& & &* @return
& & private static String dealPostParams(Map&String, String& params, String enc) {
& & & & StringBuffer sb = new StringBuffer();
& & & & for (Entry&String, String& entry : params.entrySet()) {
& & & & & & try {
& & & & & & & & sb.append(entry.getKey()).append(&=&)
& & & & & & & & & & & & .append(URLEncoder.encode(entry.getValue(), enc))
& & & & & & & & & & & & .append(&&&);
& & & & & & } catch (UnsupportedEncodingException e) {
& & & & & & & & e.printStackTrace();
& & & & & & }
& & & & sb.deleteCharAt(sb.length() - 1);
& & & & return sb.toString();
& & &* 获取HttpClient
& & &* @return
& & @SuppressWarnings(&deprecation&)
& & public static synchronized HttpClient getHttpClient() {
& & & & if (null == httpClient) {
& & & & & & httpClient = new DefaultHttpClient();
& & & & return httpC
$.post(url, { json: postdata }, function (json) {
if (json) {
jBox.tip(&添加成功!&, &提示&);
location.reload();
jBox.tip(&添加失败!&, &提示&);
location.reload();
}, &json&)
编程语言基础
数据库开发
客户端开发
服务器软硬件
开源组件类库
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友12502人阅读
Web(336)
www-form-urlencoded是POST数据默认编码格式,POST过去的key-value会被编码成QueryString,格式如下:name=test&gender=male&email=服务器端对接受数据的处理也很简单。json一般更多用来返回数据而不是在提交数据的时候使用,通常Restful服务都会支持json/xml格式的返回数据。json对象及其编解码在各个平台(无论服务器、电脑还是手机)都有很好的支持。那么怎么选择这两种方式呢?这不是一个非错即对的选择,但可以参考如下的实践建议:如果数据是简单、平面的key-value数值对,那么使用www-form-urlencoded简单实用,不需要额外的编解码;如果数据是复杂的嵌套关系,有多层数据,那么使用json会简化数据的处理,从而更高效。iefreer
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3429706次
积分:33273
积分:33273
排名:第119名
原创:464篇
转载:56篇
译文:83篇
评论:445条
(1)(1)(2)(3)(5)(1)(1)(3)(5)(6)(10)(4)(6)(2)(2)(1)(2)(3)(2)(3)(1)(2)(3)(6)(7)(13)(19)(21)(17)(21)(17)(5)(18)(17)(9)(8)(2)(2)(10)(8)(9)(7)(7)(17)(6)(18)(6)(10)(12)(1)(15)(2)(7)(4)(9)(7)(4)(3)(5)(12)(3)(18)(11)(6)(3)(8)(7)(5)(1)(5)(5)(2)(3)(1)(1)(3)(5)(3)(1)(10)(1)(1)(5)(11)(12)(22)(5)(12)(1)(1)(1)

我要回帖

更多关于 post提交json数据格式 的文章

 

随机推荐