AFNetworking 接口mybatis 返回值类型型不确定时怎么做

 上传我的文档
 下载
 收藏
愿得一心人,白首不相离
 下载此文档
正在努力加载中...
[无限互联]afnetworking核心类afurlconnectionoperation的详解
下载积分:3000
内容提示:[无限互联]afnetworking核心类afurlconnectionoperation的详解
文档格式:DOC|
浏览次数:29|
上传日期: 07:43:25|
文档星级:
该用户还上传了这些文档
[无限互联]afnetworking核心类afurlconnectionoperati
官方公共微信请求失败:无法接受的内容类型:文本/使用AFNetworking 2.0 HTML-ios,afnetworking,afnetworking-2-CodeGo.net
请求失败:无法接受的内容类型:文本/使用AFNetworking 2.0 HTML
我尝试了新的版本2.0 AFNetworking和我收到上述错误。任何想法,为什么会这样?这里是我的代码:
NSURL *URL = [NSURL URLWithString:kJSONlink];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
[[NSOperationQueue mainQueue] addOperation:op];
任何想法将不胜感激。我的Xcode 5.0是否有帮助。谢谢!
此外,这里的
Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0xda2e670 {NSErrorFailingURLKey=kJSONlink, AFNetworkingOperationFailingURLResponseErrorKey=&NSHTTPURLResponse: 0xda35180& { URL: kJSONlink } { status code: 200, headers {
Connection = "Keep-Alive";
"Content-Encoding" =
"Content-Length" = 2898;
"Content-Type" = "text/html";
Date = "Tue, 01 Oct :45 GMT";
"Keep-Alive" = "timeout=5, max=100";
Server = A
Vary = "Accept-Encoding";
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html}
我只是藏在我们的kJSONlink。这应该返回一个JSON。
本文地址 :CodeGo.net/611205/
-------------------------------------------------------------------------------------------------------------------------
1. 我也遇到这个问题。
你的服务器发送,而不是已经支持的类型“。
一个小的搜索后,我的解决办法是添加“到AFURLResponseSerialization类中设置acceptableContentTypes。只要搜索”acceptableContentTypes“,并添加”到设定手动。
当然,理想的解决方案将是从服务器上改变TPE,但你将灯罩与服务器团队交谈。
我希望这可以帮助你。
最好的问候,少的bug可能在代码中。
我的设置RequestOperationManager响应序列化到HTTPResponseSerializer固定的问题。
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
所以我不会需要添加acceptableContentTypes每一个要求我做。
在服务器端 CodeGo.net,我说:
header('Content-type: application/json');
进入我的代码,这也解决了这一问题。
本文标题 :请求失败:无法接受的内容类型:文本/使用AFNetworking 2.0 HTML
本文地址 :CodeGo.net/611205/
Copyright (C) 2014 CodeGo.net后使用快捷导航没有帐号?
浏览&&:&301
回复&&:&0
回复的帖子
本帖最后由 王许柔 于
10:04 编辑
  前言:已经有一个月没写点什么了,感觉心里空落落的。今天再来篇干货,想要学习Web的园友们速速动起来,跟着博主一起来学习吧。作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值。
  使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型
  void无返回值
  IHttpActionResult
  HttpResponseMessage
  自定义类型
  此篇就围绕这四块分别来看看它们的使用。
  一、void无返回值
  void关键字我们都不陌生,它申明方法没有返回值。它的使用也很简单,我们来看一个示例就能明白。
public class ORDER
& & {
& && &&&public string ID { }
& && &&&public string NO { }
& && &&&public string NAME { }
& && &&&public string DESC { }
& & }
复制代码   public class OrderController : ApiController
& & {
& && &&&[HttpPost]
& && &&&public void SaveOrder(ORDER name)
& && &&&{
& && && && &//处理业务逻辑
& && &&&}
& & }复制代码
  在Web里面调用
$(function () {
& & $.ajax({
& && &&&type: 'post',
& && &&&url: 'http://localhost:21528/api/Order/SaveOrder',
& && &&&data: { ID: &aaa&, NAME: &test& },
& && &&&success: function (data, status) {
& && && && &alert(data);
& && &&&}
& & });
});复制代码
  得到结果
1.gif (363.12 KB, 下载次数: 0)
09:54 上传
  可以看到,使用void申明的方法,在success方法里面得不到返回值,并且会返回http状态码204,告诉客户端此请求没有返回值。
  二、IHttpActionResult
  IHttpActionResult类型是WebApi里面非常重要的一种返回值类型。下面博主就根据平时在项目里面使用最多的几种方式来讲解下这种类型的返回值的一些用法。
  1、Json(T content)
  使用MVC开发过的朋友一定记得,在MVC里面,请求数据的接口的返回值类型大部分使用的是JsonResult,在MVC里面你一定也写过类似这样的接口:
public JsonResult GetResult()
& && &&&{
& && && && &return Json(new { }, JsonRequestBehavior.AllowGet);
& && &&&}复制代码
  那么,在WebAPI里面是否也存在类似的用法呢。呵呵,在这点上面,微软总是贴心的。在WebApi的ApiController这个抽象类里面,为我们封装了Json(T content)这个方法,它的用法和MVC里面的JsonResult基本类似。我们通过一个例子来说明它的用法:
     [HttpGet]
& && &&&public IHttpActionResult GetOrder()
& && &&&{
& && && && &var lstRes = new List();
& && && && &//实际项目中,通过后台取到集合赋值给lstRes变量。这里只是测试。
& && && && &lstRes.Add(new ORDER() { ID = &aaaa&, NO = &111&, NAME = &111&, DESC = &1111& });
& && && && &lstRes.Add(new ORDER() { ID = &bbbb&, NO = &222&, NAME = &222&, DESC = &2222& });
& && && && &return Json&(lstRes);
& && &&&}复制代码
  看到这个代码,有人就疑惑了,我们定义的返回值类型是IHttpActionResult类型,直接返回Json(T content)这样可行么?我们将Json转到定义看看:
& && &&&protected internal JsonResult Json(T content);复制代码
  我们继续将JsonResult转到定义
·1.png (10.23 KB, 下载次数: 1)
10:01 上传
  原来JsonResult是实现了IHttpActionResult接口的,难怪可以直接返回呢。
  知道了这个,我们直接在Web里面通过ajax请求来调用:
$(function () {
& & $.ajax({
& && &&&type: 'get',
& && &&&url: 'http://localhost:21528/api/Order/GetOrder',
& && &&&data: {},
& && &&&success: function (data, status) {
& && && && &alert(data);
& && &&&}
& & });
});复制代码
  来看结果:
1.gif (401.02 KB, 下载次数: 0)
10:02 上传
  既然实体类可以直接这样传递,那么如果我们想要传递一些匿名类型呢,因为很多情况下,我们需要返回到的对象都没有对应的实体来对应,如果我们想要返回匿名对象怎么办呢?我们知道,这里的Json(T content)必须要传一个对应的泛型类型,如果是匿名类型这里肯定不好传。还好有我们的object类型,当然你可以使用dynamic,我们来试一把。
& && &&&[HttpGet]
& && &&&public IHttpActionResult GetOrder()
& && &&&{
& && && &
& && && && &return Jsondynamic&(new { AA = &&, BB = &cc& });
& && &&&}复制代码
  同样的来看测试结果:
1.gif (257.92 KB, 下载次数: 0)
10:02 上传
  2、Ok()、 Ok(T content)
  除了Json(T content),在ApiController里面还有另外一个比较常用的方法:Ok()。同样,我们将Ok()转到定义
protected internal virtual OkResult Ok();复制代码
  OkResult转到定义
·1.png (7.23 KB, 下载次数: 0)
10:02 上传
  有了这个作为基础,我们就可以放心大胆的使用了。
& && &&&[HttpGet]
& && &&&public IHttpActionResult GetOKResult()
& && &&&{
& && && && &return Ok();
& && &&&}复制代码
  得到结果
1.gif (203.82 KB, 下载次数: 0)
10:02 上传
  除了Ok()之外,还有另外一个重载Ok(T content)。
& && &&&[HttpGet]
& && &&&public IHttpActionResult GetOKResult(string name)
& && &&&{
& && && && &return Okstring&(name);
& && &&&}复制代码
1.gif (214.01 KB, 下载次数: 0)
10:03 上传
  这种用法和Json(T content)比较类似,如果你非要问这两者有什么区别,或者说怎么选择两者。那么我的理解是如果是返回实体或者实体集合,建议使用Json(T content),如果是返回基础类型(如int、string等),使用Ok(T content)。
  3、NotFound()
  当需要向客户端返回找不到记录时,有时需要用到NotFound()方法。
protected internal virtual NotFoundResult NotFound();复制代码
·1.png (6.4 KB, 下载次数: 0)
10:03 上传
  来看看它的使用场景
& && &&&[HttpGet]
& && &&&public IHttpActionResult GetNotFoundResult(string id)
& && &&&{
& && && && &var lstRes = new List();
& && && && &//实际项目中,通过后台取到集合赋值给lstRes变量。这里只是测试。
& && && && &lstRes.Add(new ORDER() { ID = &aaaa&, NO = &111&, NAME = &111&, DESC = &1111& });
& && && && &lstRes.Add(new ORDER() { ID = &bbbb&, NO = &222&, NAME = &222&, DESC = &2222& });
& && && && &var oFind = lstRes.FirstOrDefault(x =& x.ID == id) ;
& && && && &if (oFind == null)
& && && && &{
& && && && && & return NotFound();
& && && && &}
& && && && &else
& && && && &{
& && && && && & return Json(oFind);
& && && && &}
& && &&&}复制代码$(function () {
& & $.ajax({
& && &&&type: 'get',
& && &&&url: 'http://localhost:21528/api/Order/GetNotFoundResult',
& && &&&data: { id :&cccc& },
& && &&&success: function (data, status) {
& && && && &alert(data);
& && &&&}
& & });
});复制代码
  得到结果
  NotFound()方法会返回一个404的错误到客户端。
  4、其他
  其他还有一些方法,都有它特定的用途。在此贴出来。
  4.1、Content(HttpStatusCode statusCode, T value)
& && &&&[HttpGet]
& && &&&public IHttpActionResult GetContentResult()
& && &&&{
& && && && &return Contentstring&(HttpStatusCode.OK, &OK&);
& && &&&}复制代码
  向客户端返回值和http状态码。
  4.2、BadRequest()
& && &&&[HttpGet]
& && &&&public IHttpActionResult GetBadRequest(ORDER order)
& && &&&{
& && && && &if (string.IsNullOrEmpty(order.ID))
& && && && && & return BadRequest();
& && && && &return Ok();
& && &&&}复制代码
  向客户端返回400的http错误。
  4.3、Redirect(string location)
& && &&&[HttpGet]
& && &&&public IHttpActionResult RedirectResult()
& && &&&{
& && && && &return Redirect(&http://localhost:21528/api/Order/GetContentResult&);
& && &&&}复制代码
  将请求重定向到其他地方。
  5、自定义IHttpActionResult接口的实现
  上面介绍了一些系统内置的常用的实现IHttpActionResult接口的方法。如果我们需要自定义IHttpActionResult的返回呢?
  在介绍之前,我们有必要先来看看IHttpActionResult类型的定义,将IHttpActionResult转到定义可以看到:
namespace System.Web.Http
{
& & // 摘要:
& & //& &&&Defines a command that asynchronously creates an System.Net.Http.HttpResponseMessage.
& & public interface IHttpActionResult
& & {
& && &&&// 摘要:
& && &&&//& &&&Creates an System.Net.Http.HttpResponseMessage asynchronously.
& && &&&//
& && &&&// 参数:
& && &&&//& &cancellationToken:
& && &&&//& &&&The token to monitor for cancellation requests.
& && &&&//
& && &&&// 返回结果:
& && &&&//& &&&A task that, when completed, contains the System.Net.Http.HttpResponseMessage.
& && &&&Task ExecuteAsync(CancellationToken cancellationToken);
& & }
}复制代码
  这个接口包含唯一的一个方法ExecuteAsync(),此方法将以异步方式创建一个HttpResponseMessage实例返回给客户端。
  有了这个作为基础,下面,我们自定义一个bootstrapTable服务端分页的子类去展示自定义IHttpActionResult的用法。
  首先,自定义一个实现类
  public class PageResult : IHttpActionResult
& & {
& && &&&object _
& && &&&HttpRequestMessage _
& && &&&public PageResult(object value, HttpRequestMessage request)
& && &&&{
& && && && &_value =
& && && && &_request =
& && &&&}
& && &&&public Task ExecuteAsync(System.Threading.CancellationToken cancellationToken)
& && &&&{
& && && && &var response = new HttpResponseMessage()
& && && && &{
& && && && && & Content = new ObjectContent(typeof(object), _value, new JsonMediaTypeFormatter()),
& && && && && & RequestMessage = _request
& && && && &};
& && && && &return Task.FromResult(response);
& && &&&}
& & }复制代码
  然后,在API接口里面返回PageResult对象
    [HttpGet]
& && &&&public IHttpActionResult GetPageRow(int limit, int offset)
& && &&&{
& && && && &var lstRes = new List();
& && && && &//实际项目中,通过后台取到集合赋值给lstRes变量。这里只是测试。
& && && && &lstRes.Add(new ORDER() { ID = &aaaa&, NO = &111&, NAME = &111&, DESC = &1111& });
& && && && &lstRes.Add(new ORDER() { ID = &bbbb&, NO = &222&, NAME = &222&, DESC = &2222& });
& && && && &var oData = new { total = lstRes.Count, rows = lstRes.Skip(offset).Take(limit).ToList() };
& && && && &return new PageResult(oData, Request);
& && &&&}复制代码
  最好,ajax调用
$(function () {
& & $.ajax({
& && &&&type: 'get',
& && &&&url: 'http://localhost:21528/api/Order/GetPageRow',
& && &&&data: { limit:1,offset:1},
& && &&&success: function (data, status) {
& && && && &alert(data);
& && &&&}
& & });
});复制代码
  得到结果
1.gif (398.23 KB, 下载次数: 0)
10:04 上传
  三、HttpResponseMessage
  在上文自定义IHttpActionResult返回类型的时候,提到过HttpResponseMessage这个对象。它表示向客户端返回一个http响应的消息对象(包含http状态码和需要返回客户端的消息)。这个对象也有它独特的使用场景:需要向客户端返回HttpResponse时就要用到这个对象。以导出为例,由于需要将导出的Excel文件输出到客户端浏览器,Webapi的服务端需要向Web的客户端输出文件流,这个时候一般的IHttpActionResult对象不方便解决这个问题,于是HttpReponseMessage派上了用场。我们来看看它的使用示例。
    public HttpResponseMessage Export()
& && &&&{
& && && && &//取数据
& && && && &var lstRes = OrderBLL.Export();
& && && && &//向Excel里面填充数据
& && && && &HSSFWorkbook workbook = new HSSFWorkbook();
& && && && &CreateAndFillSheet(workbook, lstRes);
& && && && &
& && && && &//保存到服务
& && && && &var fileName = &Excel& + DateTime.Now.ToString(&yyyyMMddHHmmss&) + &.xls&;
& && && && &var strPath = bine(AppDomain.CurrentDomain.BaseDirectory, @&Data& + fileName);
& && && && &using (FileStream fs = new FileStream(strPath, FileMode.Create))
& && && && &{
& && && && && & workbook.Write(fs);
& && && && && & using (MemoryStream ms = new MemoryStream())
& && && && && & {
& && && && && && &&&workbook.Write(ms);
& && && && && & }
& && && && &}
& && && && &//输出到浏览器
& && && && &try
& && && && &{
& && && && && & var stream = new FileStream(strPath, FileMode.Open);
& && && && && & HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
& && && && && & response.Content = new StreamContent(stream);
& && && && && & response.Content.Headers.ContentType = new MediaTypeHeaderValue(&application/octet-stream&);
& && && && && & response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(&attachment&)
& && && && && & {
& && && && && && &&&FileName = fileName
& && && && && & };
& && && && && &
& && && && &}
& && && && &catch
& && && && &{
& && && && && & return new HttpResponseMessage(HttpStatusCode.NoContent);
& && && && &}
& && &&&}复制代码
  将文件流保存在StreamContent对象里面,然后输出到浏览器。在浏览器端即可将Excel输出。
  四、自定义类型
  以上几种返回值类型能解决我们大部分返回值的问题,当然,你也可以将webapi的接口和普通方法一样,返回任意的类型,WebApi会自动序列化你自定义任何返回类型,然后将序列化的值写到响应正文里,状态码统一返回200。比如:
& && &&&[HttpGet]
& && &&&public object GetOther()
& && &&&{
& && && && &var lstRes = new List();
& && && && &//实际项目中,通过后台取到集合赋值给lstRes变量。这里只是测试。
& && && && &lstRes.Add(new ORDER() { ID = &aaaa&, NO = &111&, NAME = &111&, DESC = &1111& });
& && && && &lstRes.Add(new ORDER() { ID = &bbbb&, NO = &222&, NAME = &222&, DESC = &2222& });
& && && && &return lstR
& && &&&}复制代码
  得到结果
1.gif (100.84 KB, 下载次数: 0)
10:04 上传
  和上面的Json、Ok等用法在效果上面没有太大区别。
  五、总结
  以上通过四个方面详细分享了下WebApi里面返回值的常见用法,不能说哪种方式最好,因为每种方式都有其特定的使用场景。博主觉得为了规范WebApi接口,对于一般接口的返回值,尽量使用IHttpActionResult类型作为返回值,毕竟是微软内置的东西,可能为我们考虑了很多我们考虑不到的东西。
电话:010-
地址:北京市海淀区北清路68号
移动客户端下载
微信公众号:yonyouudn
扫描右侧二维码关注我们
专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041
京公网网备安4
Powered by Discuz!iOS AFNetworking 打印从服务器返回的错误提示信息 - ljmaque - 博客园
随笔 - 21, 文章 - 0, 评论 - 7, 引用 - 0
每次做项目的时候都会在网络请求时候测试接口的时候会出现一些不同的错误,而控制台打印的错误提示信息都是data类型,看不出提示的错误的信息是什么。后面经过一些查阅发现其实是可以把这个转变为string的类型,这样就可以很明了的知道是什么错误。下面就来看看如何修改
(1)找到AFNetWorking的AFURLResponseSerialization.m 文件
(2)加上这句&
#ifdef DEBUG
NSString * const AFNetworkingOperationFailingURLResponseStringErrorKey =
@"com.alamofire.serialization.response.error.string";
(3)找到这句&
if (data) {
mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] =
替换成 (总共有两个地方要换)
if (data) {
mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] =
#ifdef DEBUG
mutableUserInfo[AFNetworkingOperationFailingURLResponseStringErrorKey] = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
(4)在网络请求的方法的&failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {// 在这里添加
  NSLog(@"error ==%@", [error userInfo][@"com.alamofire.serialization.response.error.string"]);
&} 这样以后请求数据返回的错误提示就会以字符串的行打印出来, 一看就知道是什么错误了。。。。AFNetworking 接收text/html格式返回数据
//获取微信支付订单号
AFHTTPRequestOperationManager *manger = [AFHTTPRequestOperationManager manager];
//一定要去除 //
manger.responseSerializer = [AFHTTPResponseSerializer serializer];
NSString *urlStr = @&http://wxpay./pub_v2/app/app_pay.php?plat=ios&;
//设置text/html
NSSet *set = [NSSet setWithObject:@&text/html&];
[manger.responseSerializer setAcceptableContentTypes:set];
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
strBuyerID,@&BuyerID&,
strAmount,@&Amount&, nil];
NSDictionary *reqDataDic = [NSDictionary dictionaryWithObjectsAndKeys:[dic JSONRepresentation],@&reqData&, nil];
[manger GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation,id responseObject){
// 解析订单号
NSDictionary *dict =(NSDictionary *)responseO
if(dict != nil){
NSMutableString *retcode = [dict objectForKey:@&retcode&];
if (retcode.intValue == 0){
[self payWithWechat:dict];
UIAlertView *dialog=[[UIAlertView alloc]
initWithTitle:@&错误&
message:@&创建微信支付订单信息时发生内部错误&
delegate:nil
cancelButtonTitle:@&确定&
otherButtonTitles:nil];
[dialog show];
UIAlertView *dialog=[[UIAlertView alloc]
initWithTitle:@&错误&
message:@&创建微信支付订单信息时发生内部错误&
delegate:nil
cancelButtonTitle:@&确定&
otherButtonTitles:nil];
[dialog show];
}failure:^(AFHTTPRequestOperation *operation,NSError *errpr){
NSLog(@&Create Alipay Order Failed, %@&,[errpr localizedDescription]);
UIAlertView *dialog=[[UIAlertView alloc]
initWithTitle:@&错误&
message:@&创建微信支付订单信息时错误,无法连接服务器&
delegate:nil
cancelButtonTitle:@&确定&
otherButtonTitles:nil];
[dialog show];
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 返回值类型 的文章

 

随机推荐