2015-06-20 106 views
0

我看到,与$.ajax()我可以使用dataType属性来告诉jQuery什么样的响应我期望从服务器,通常是json确定HTTP请求的数据类型

但是在服务器端,我如何知道请求的数据类型?

我知道服务器通常应该根据请求的内容知道要发送什么,但我的用例在这里有点不同。我有一个内置在PHP中的错误处理程序,我想知道以哪种格式输出调试信息。如果出现致命/语法错误,警告,脚本甚至可能无法到达与请求关联的请求处理函数。

有一个CONTENT_TYPE标题,但显然它总是application/x-www-form-urlencoded,它只发送POST请求。

还有一个HTTP_ACCEPT标题看起来像application/json, text/javascript, */*; q=0.01。我需要解析这个字符串吗?

+1

有一个单独的查询参数可能是一个更好的主意,它指示您应该发送什么类型的响应。我认为你不应该依赖'HTTP_ACCEPT'被正确设置,并且有人可能会要求例如纯文本,但后来想解析为JSON。 – Xymostech

回答

1

客户端没有标准的方式来告诉服务器需要什么样的数据类型。客户不告诉“我想要文本/纯文本”或“只有HTML请”(这只能从假设从URI)。他们只告诉他们可以解释的内容(HTTP_ACCEPT)以及他们发布的内容(CONTENT_TYPE)。

对于服务器端错误处理程序,以可靠地确定要使用的输出格式,你可以通过额外的请求头或查询参数符合你的要求,例如:

$.ajax({ 
    ... 
    headers: { 
     "X-Expected-Format": "text/plain" 
    } 
    ... 
}); 
+0

['Accept'](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)请求头部就是这么做的。如果这只包含“text/plain”,那么客户端_is_告诉服务器需要哪种数据类型。如果服务器无法返回该数据类型,则应该使用“HTTP 406”进行响应。 – SilverlightFox

0

没有为没有标准约定Ajax客户端在响应中告诉服务器它想要的数据格式。

对于特定的Ajax请求,通常有几件事情是真实的。

  1. 该请求被称为生成特定类型的响应(例如,仅此响应并始终生成JSON)。客户端不请求特定类型的数据。它只知道这个特定的请求只返回JSON。

  2. 该请求有一个与它一起发送的特定参数,用于请求特定类型的返回数据(例如XML,HTML,JSON等)。这可能是一个查询参数(如果它是一个GET请求)。

  3. Ajax调用的路径决定请求的响应类型。例如,我已经看到一个API,它使用请求中的一个路径段来确定响应是XML还是JSON。

尽管选项2可以使用自定义HTTP标头完成,但通常不会使用HTTP标头完成。如果发送任何参数,它通常作为ajax调用参数的一部分发送(但是会发送它们)。


dataType选项jQuery提供是需要告诉jQuery库应该期待什么类型的响应,这样,如果是JSON,例如,它可以解析JSON你。这个参数通常不是必需的,因为jQuery通常可以根据HTTP标头或基于响应本身的样本来判断它的响应类型。在为Ajax请求指定dataType当然没有任何伤害,但它绝对必须与服务器返回的数据类型相匹配,并且您设置的dataType值不会以任何方式发送到服务器。这纯粹是对客户端库的指示,说明它在到达时应如何处理响应。