本文目录一览:
- 1、webapi 如何返回json字符串?
- 2、在WebApi中返回一个JSON格式的数据,如何到客户端就变了
- 3、webapi返回图片客户端如何接收
- 4、c#mvc中的webapi怎么迫使服务端返回字符串
- 5、怎么让webapi返回json
- 6、webapi 返回类型到底应该是什么才合适,这是个问题
webapi 如何返回json字符串?
方法一:(改配置法)
找到Global.asax文件,在Application_Start()方法中添加一句:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// 使api返回为json
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}
在WebApi中返回一个JSON格式的数据,如何到客户端就变了
转载 在使用Web Api的时候,有时候只想返回JSON;实现这一功能有多种方法,本文提供两种方式,一种传统的,一种作者认为是正确的方法。
JSON in Web API – the formatter based approach
只支持JSON最普遍的做法是:首先清除其他所有的formatters,然后只保留JsonMediaTypeFormatter。
有了HttpConfiguration的实例,你将会很简单的清除所有formatters,然后重新添加JsonMediaTypeFormatter。
实现代码如下:
configuration.Formatters.Clear();
configuration.Formatters.Add(new JsonMediaTypeFormatter());这种方式虽然可以实现功能,但是所有的conent negotiation还是会发生,这就会产生以下额外的开销了。因为,你已经知道要返回的结果了,也只想返回Json,其他的content negotiation都不需要了。-webapi返回文件
下面的方法可以很好的解决这个问题。
JSON in Web API – the conneg based approach
最好的方法是使用自定义的只返回Json Result的content negotiation代替Web Api中默认的content negotiation。
Conneg通过实现IContentNegotiator的Negotiator方法实现扩展。Negotiator方法返回ContentNegotiationResult(它包装了你选择的headers和formatter)。-webapi返回文件
下面的方法通过传递一个JsonMediaTypeFormatter给自定义的conneg negotiator,让它一直返回applicaton/json 的content-type以及JsonMediaTypeFormatter。这种方法避免了每次请求都要重新创建一次formatter。-webapi返回文件
代码如下:
public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;
public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}
public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerableMediaTypeFormatter formatters)-webapi返回文件
{
var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));-webapi返回文件
return result;
}
}接下来,你需要在HttpConfiguration实例上注册你的新的实现机制:
var jsonFormatter = new JsonMediaTypeFormatter();
//optional: set serializer settings here
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
通过替换默认的DefaultContentNegotiator,我们使用我们自定义的JsonContentNegotiator,它只支持Json,而且可以马上返回。
如果你想更深入的了解Content Negotiation的知识,你可以查看作者的这篇文章。
总结
通过使用自定义的JsonContentNegotiator替换系统默认的DefaultContentNegotiator,很好的实现Web Api只返回Json的功能,而且没有额外的开销。
webapi返回图片客户端如何接收
webapi返回图片客户端如何接收想显示出图片是吗,再uploadSuccess里面打印下file对象(后台),看下文件路径,然后$("选择器").attr("src","文件路径")就可以了
c#mvc中的webapi怎么迫使服务端返回字符串
返回值是string就好了。
public string Get(int id)
{
return "字符串";
}
用AJAX取json格式的就是这样的。
$.ajax({url:'/api/Values/1',dataType:'json',type:'get',success:function(data){console.log(data);}})
主要是客户端的设置,如果客户端能够支持XML,就会返回XML格式的,如果能支持json,就会直接返回字符串。
Accept:application/json, text/javascript, */*; q=0.01
像这样就是字符串的
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
像这样就是xml的
还可以这样:
var formatters = GlobalConfiguration.Configuration.Formatters;
formatters.Remove(formatters.XmlFormatter);
这样就可以强制不使用XML格式返回
怎么让webapi返回json
返回的时候封装成json即可。
参考: Student st1 = new Student(1, "dg", 18, new Date());
Student st2 = new Student(2, "dg", 18, new Date());
Student st3 = new Student(3, "dg", 18, new Date());
Student st4 = new Student(4, "dg", 18, new Date());
Student st5 = new Student(5, "dg", 18, new Date());
List li = new ArrayList();
JSONObject JO1 = new JSONObject(st1);
JSONObject JO2 = new JSONObject(st2);
JSONObject JO3 = new JSONObject(st3);
JSONObject JO4 = new JSONObject(st4);
JSONObject JO5 = new JSONObject(st5);
li.add(JO1);
li.add(JO2);
li.add(JO3);
li.add(JO4);
li.add(JO5);
JSONArray Ja = new JSONArray(li);
Map ma = new HashMap();
ma.put("Result", "OK");
ma.put("Records", Ja);
JSONObject js = new JSONObject(ma);
out.print(js);
返回结果:
{"Result":"OK","Records":[{"recordDate":"Fri Dec 16 17:54:39 CST 2011","name":"dg","age":18,"personId":1},{"recordDate":"Fri Dec 16 17:54:39 CST 2011","name":"dg","age":18,"personId":2},{"recordDate":"Fri Dec 16 17:54:39 CST 2011","name":"dg","age":18,"personId":3},{"recordDate":"Fri Dec 16 17:54:39 CST 2011","name":"dg","age":18,"personId":4},{"recordDate":"Fri Dec 16 17:54:39 CST 2011","name":"dg","age":18,"personId":5}]}-webapi返回文件
可以将存放Java对象的 列表 直接转化为 json 数组 或对象,不必要过分麻烦的转换。
从数据库取出后换:
SourceDao sd = new SourceDao();
JSONArray ja = new JSONArray(sd.query(content));
webapi 返回类型到底应该是什么才合适,这是个问题
我们知道在WebAPi中对于响应结果我们都是这样用的:
public HttpResponseMessage GetResultT(T t)
{
return Request.CreateResponseT(HttpStatusCode.OK, t);
}
在项目中前端为了和其他统一,封装了一套响应的结果和状态码,要求直接返回对象,于是将上述修改成比如如下:
public ResultListPerson GetResult()
{
var result = new ResultListPerson();
return result;
}
public class ResultT : BaseResult
{
public T Data;
}
public class BaseResult
{
public string Message;
public int Status;
public ErrorCode ErrorCode;
}
public enum ErrorCode
{
......
}
统观以上两种方法,一种是WebAPi内置响应的结果,另外一种则是直接返回自定义响应结果。
于是乎,我开始思索这两种方法虽然都能得到我们想要的结果,但是有什么区别没有呢?说的更加明确一点的是,二者在数据响应上有没有性能上的差异呢?
WebAPi响应结果和自定义响应结果二者性能差异
以上则是需要返回对象来进行处理,而有些我们则不需要返回任何对象来进行处理例如直接返回void,而在WebAPi中对应需要返回 IHttpActionResult 例如自定义返回则是如下:
public void GetFirst()
{.....}
在WebAPi中则是进行如下返回:
public IHttpActionResult GetSecond()
{
return OK();
}
下面我们在控制台中分别来测试这二者在WebHost以及在SelfHost上的差异,我们如何获取其差异呢?我们通过对void方法和http方法在控制台中发出1000个请求来获取其总共花费时间来进行比较。-webapi返回文件
SelfHost
[HttpGet]
public void GetFirst()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i 20; i++)
{
stringbuilder.Append("something");
}
}
[HttpGet]
public IHttpActionResult GetSecond()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i 20; i++)
{
stringbuilder.Append("something");
}
return Ok();
}
在控制台中方法如下:
private const string voidUrl = "";
private const string httpUrl = "";
private static ListTimeSpan voidTimes = new ListTimeSpan();
private static ListTimeSpan httpTimes = new ListTimeSpan();
static void Main(string[] args)
{
Console.WriteLine("Start Test....");
for (int i = 0; i 1000; i++)
{
voidTimes.Add(getResponse(voidUrl));
Thread.Sleep(10);
Console.WriteLine("void Test " + i);
}
Console.WriteLine("Finished Void Test");
for (int i = 0; i 1000; i++)
{
httpTimes.Add(getResponse(httpUrl));
Thread.Sleep(10);
Console.WriteLine("http Test " + i);
}
Console.WriteLine("Finished Http Test");
var voidTotalTime = voidTimes.Sum(t = t.Milliseconds);
Console.WriteLine("void方法发出1000个请求总共需要时间:" + voidTotalTime);
Console.WriteLine("void方法平均每一个请求需要时间:" + voidTotalTime / 1000.00 + "秒");
var httpTotalTime = httpTimes.Sum(t = t.Milliseconds);
Console.WriteLine("http方法发出1000个请求总共需要时间: " + httpTotalTime);
Console.WriteLine("http方法平均每一个请求需要时间: " + httpTotalTime / 1000.00 + "秒");
Console.Read();
}
static TimeSpan getResponse(string url)
{
var stopWatch = new Stopwatch();
stopWatch.Start();
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(url);
var task = httpClient.GetAsync(httpClient.BaseAddress).Result;
var result = task.Content.ReadAsAsync(typeof(object));
var timeSpan = stopWatch.Elapsed;
stopWatch.Stop();
return timeSpan;
}