@ResponseBody不一定返回json,第1张

我们先来公布正确的答案。

@ResponseBody 的输出格式,默认情况取决于客户端的 Accept 请求头。

application/xml | text/xml | application/+xml

Http报头分为通用报头,请求报头,响应报头和实体报头。

请求方的http报头结构:通用报头|请求报头|实体报头

响应方的http报头结构:通用报头|响应报头|实体报头

比如:Accept:text/xml(application/json);

代表客户端希望接受的数据类型是xml(json )类型

Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。

比如:Content-Type:text/html(application/json) ;

代表发送端发送的数据格式是html(json)。

二者合起来,

Accept:text/xml;

Content-Type:text/html

即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。

如果accept指定的类型和response返回的类型不一致,会出现406,not acceptable错误,对应到java spring工程,就是

HttpHeaders headers = new HttpHeaders();

headersadd("Accept", MediaTypeAPPLICATION_JSON_UTF8_VALUEtoString());

如果head头里加了accept,那么@RequestMapping里的 produces = "/" 或 produces = "application/json"

Conteny-Type:内容类型,即请求/响应的内容区数据的媒体类型

Accept:用来指定什么媒体类型的响应是可接受的,即告诉服务器我需要什么媒体类型的数据,此时服务器应该根据Accept请求头生产指定媒体类型的数据。

问题:

服务器端可以通过指定headers = “Content-Type=application/json”来声明可处理(可消费)的媒体类型,即只消费Content-Type指定的请求内容体数据;

客户端如何告诉服务器端它只消费什么媒体类型的数据呢?即客户端接受(需要)什么类型的数据呢?服务器应该生产什么类型的数据?此时我们可以请求的Accept请求头来实现这个功能。

上面两个例子都表示了request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json:

produces标识:produces="application/json"

headers = "Accept=application/json"

其中request Content-Type为“application/json”类型的请求

当你有如下Accept头,将遵守如下规则进行应用:

dataType

期望返回的数据类型。null、“xml”、“script”或者“json”其中之一。dataType提供一种方法,它规定了怎样处理服务器的响应。这个被直接地反映到jQueryhttpData方法中去。下面的值被支持:

'xml':如果dataType == 'xml',将把服务器响应作为XML来对待。同时,如果“success”回调方法被指定, 将传回responseXML值。

'json':如果dataType == 'json', 服务器响应将被求值,并传递到“success”回调方法,如果它被指定的话。

'script':如果dataType == 'script', 服务器响应将求值成纯文本。

默认值:null(服务器返回responseText值)

这是unicode编码,不是乱码,你进行Unicode转码就出来了 给你写个方法转码,将unicode传递进去返回字符串 public String convert(String utfString){StringBuilder sb = new StringBuilder();int i = -1;int pos = 0;while((i=utfStringindexOf("\

Web Service接口方法

   [WebMethod]

public string Project(string paramaters)

{

return paramaters;

}

实现代码

public string Post(string methodName, string jsonParas)

{

string strURL = Url + "/" + methodName;

//创建一个HTTP请求

HttpWebRequest request = (HttpWebRequest)WebRequestCreate(strURL);

//Post请求方式

requestMethod = "POST";

//内容类型

requestContentType = "application/x-www-form-urlencoded";

//设置参数,并进行URL编码

//虽然我们需要传递给服务器端的实际参数是JsonParas(格式:[{\"UserID\":\"0206001\",\"UserName\":\"ceshi\"}]),

//但是需要将该字符串参数构造成键值对的形式(注:"paramaters=[{\"UserID\":\"0206001\",\"UserName\":\"ceshi\"}]"),

//其中键paramaters为WebService接口函数的参数名,值为经过序列化的Json数据字符串

//最后将字符串参数进行Url编码

string paraUrlCoded = SystemWebHttpUtilityUrlEncode("paramaters");

paraUrlCoded += "=" + SystemWebHttpUtilityUrlEncode(jsonParas);

byte[] payload;

//将Json字符串转化为字节

payload = SystemTextEncodingUTF8GetBytes(paraUrlCoded);

//设置请求的ContentLength

requestContentLength = payloadLength;

//发送请求,获得请求流

Stream writer;

try

{

writer = requestGetRequestStream();//获取用于写入请求数据的Stream对象

}

catch (Exception)

{

writer = null;

ConsoleWrite("连接服务器失败!");

}

//将请求参数写入流

writerWrite(payload, 0, payloadLength);

writerClose();//关闭请求流

String strValue = "";//strValue为http响应所返回的字符流

HttpWebResponse response;

try

{

//获得响应流

response = (HttpWebResponse)requestGetResponse();

}

catch (WebException ex)

{

response = exResponse as HttpWebResponse;

}

Stream s = responseGetResponseStream();

//服务器端返回的是一个XML格式的字符串,XML的Content才是我们所需要的Json数据

XmlTextReader Reader = new XmlTextReader(s);

ReaderMoveToContent();

strValue = ReaderReadInnerXml();//取出Content中的Json数据

ReaderClose();

sClose();

return strValue;//返回Json数据

}

Url的格式样例:"http://596829106:8087/IFT_Projectasmx"

  methodName参数就是"Project"

  JsonParas就是使用C# JavaScriptSerializer将List<Object>类型的对象序列化之后得到的值,数据格式:[{\"UserID\":\"0206001\",\"UserName\":\"ceshi\"}],Json数据中的中括号代表由着多个对象集合序列化,花括号代表一个对象序列化得到的结果,花括号里面的内容使用键值对的方式展示,多个属性之间用逗号隔开,每个对象也用逗号隔开。

  requestContentType必须设置值,建议使用"application/x-www-form-urlencoded",设置其他值就很容易报服务器内部异常,使用这种方式服务接口方法返回的是xml格式的字符串

  payload将请求参数转换成二进制来保存,此处一定要将“paramaters”加入其中,不然会报异常缺少参数,paramaters就是服务接口函数的参数名。函数中使用了URL编码,注意在编码的时候只需要将键和值进行编码,不要将中间的=进行编码,不然getResponse的时候会报异常。

  requestContentLength也是必须设置的值

  在得到响应流之后Stream s = responseGetResponseStream();需要使用Reader来解析响应流,这个地方我使用的是XmlTextReader,因为我服务方法返回的是xml格式的字符串,其中Json数据在xml的Content中。在取出Json数据之后,再进行相应的反序列化即可得到对象。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » @ResponseBody不一定返回json

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情