@ResponseBody不一定返回json
我们先来公布正确的答案。
@ResponseBody 的输出格式,默认情况取决于客户端的 Accept 请求头。
application/xml | text/xml | application/+xml
Http报头分为通用报头,请求报头,响应报头和实体报头。
请求方的http报头结构:通用报头|请求报头|实体报头
响应方的http报头结构:通用报头|响应报头|实体报头
比如:Accept:text/xml(application/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数据之后,再进行相应的反序列化即可得到对象。
0条评论