通过iOS设备连接时无法从本地服务器获取响应

我使用AFNetworking从一个简单的iOS项目中的基本导轨服务器检索项目。

当我在模拟器中提出请求时,一切正常。 但是,当我在设备上运行项目时发出同样的请求时,出现令人沮丧的错误。

我明白,我不能直接从我的设备连接到本地,因此需要使用我的IP地址,我正在做的。 这是奇怪的部分:当我向服务器发出请求时,我可以在我的terminal中看到服务器已被命中,并且正在返回200响应。 但是,该请求失败(在客户端),并显示错误消息:“请求超时”。

信息和代码:

我的rails服务器是非常基本的。 我基本上已经生成了一个新的项目,build立了一个名为'items'的简单模型,该项目的内容只有一个字段(一个string)。 我有路由设置为只响应JSON请求和items_controller上的索引方法只是返回JSONforms的Item.all的结果。

这是我的路线:

TestingServer::Application.routes.draw do scope :format => true, :constraints => { :format => 'json' } do resources :items, :only => [:index] end end 

这里是我的items_controller.rb

 class ItemsController < ApplicationController def index @items = Item.all render :status => 200, :json => @items end end 

至于iOS项目,这里是我的AFHTTPClient子类头:

 #import <Foundation/Foundation.h> #import "AFHTTPClient.h" @interface PNAPIClient : AFHTTPClient + (PNAPIClient *)sharedClient; @end 

这是它的实现:

 #import "PNAPIClient.h" #import "AFJSONRequestOperation.h" static NSString * const kPNAPIClientBaseURLString = @"http://<ip address>:9292/"; @implementation PNAPIClient + (PNAPIClient *)sharedClient { static PNAPIClient *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[PNAPIClient alloc] initWithBaseURL:[NSURL URLWithString:kPNAPIClientBaseURLString]]; }); return _sharedClient; } - (id)initWithBaseURL:(NSURL *)url { self = [super initWithBaseURL:url]; if (!self) { return nil; } [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; [self setDefaultHeader:@"Accept" value:@"application/json"]; return self; } @end 

最后,这是失败的请求:

 - (IBAction)testRequest:(id)sender { [[PNAPIClient sharedClient] getPath:@"/items.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) { NSLog(@"success: %@", JSON); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"failure %@", error.localizedDescription); }]; } 

最后一个评论:我尝试使用不同的URL(从另一个例子是在线),它工作正常。 这让我怀疑他们是否是我的Rails服务器的问题,或者是我的设备在本地连接到它有问题。 就像我说的,我能够从模拟器中完成任何事情,并且可以看到我正在从设备上打开服务器。

更新1

看起来,无论服务器响应是什么,都调用了-getPath:parameters:success:failure:上的失败块。 也就是说,如果服务器抛出一个带有json表示的错误的422响应,我可以在我的设备上得到错误信息。 但是,如果服务器返回一个其他的JSON对象的200响应,失败块仍然抛出…当然没有错误。

AFJSONRequestOperation将调用失败块:

  • 如果返回无效的JSON
  • 如果HTTP状态码或内容types不正确
  • 如果连接被取消或失败

在所有这些情况下,都会设置errorvariables。 事实上,这是error的存在导致失败块被调用(见[AFJSONRequestOperation -setCompletionBlockWithSuccess:failure:] )。

如果您的日志不输出任何内容,请尝试loggingerror而不是error.localizedDescription

无论如何,这听起来像你的服务器正在返回一个无效的JSON对象的HTTP 200。 您可以在故障块中设置断点,然后在debugging器中键入po operation.responseString进行检查。