无法通过iOS设备连接时获得来自本地服务器的响应(Unable to get responses f

2019-10-18 09:10发布

即时通讯使用AFNetworking检索来自于一个简单的iOS项目基本轨服务器项目。

当我做在模拟器的要求,一切工作进展顺利。 然而,当我提出同样的要求,同时运行我的设备上的项目,我发现了一个令人沮丧的错误。

我明白,我不能直接连接从我的设备到本地主机,因此需要用我的IP地址,该我做的。 这是怪异的一部分:当我向服务器的请求,我可以在我的终端服务器被击中,并返回200响应见。 然而,该请求失败(在客户端)与所述错误消息:“请求超时”。

信息和代码:

我的Rails服务器是非常基本的。 我已经基本上产生一个新的项目,成立了一个名为“项目”有一列简单的模型 - 一个字符串 - 该项目的内容。 我必须设置为只对items_controller JSON请求和索引方法应对路由只返回Item.all的JSON形式的结果。

这里是我的路线:

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失败块:参数:成功:失败:是被称为无论服务器的响应是什么。 也就是说,如果服务器抛出与错误的JSON表示一个422的响应,我能得到我的设备上的错误信息。 但是,如果服务器返回与其他一些JSON对象200响应,故障块仍然抛出......没有当然的错误。

Answer 1:

AFJSONRequestOperation将调用失败块:

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

在所有这些情况下, error变量。 事实上,它是一个存在error导致失败块被称为(参见[AFJSONRequestOperation -setCompletionBlockWithSuccess:failure:] )。

如果你的日志不输出任何东西,尝试登录error ,而不是error.localizedDescription

无论如何,这听起来像你的服务器有一个无效的JSON对象返回HTTP 200。 您可以在不良区设置一个断点,然后键入po operation.responseString在调试检查。



文章来源: Unable to get responses from local server when connecting via iOS device