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

标签 iphone ios ruby-on-rails afnetworking nsurlrequest

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

当我在模拟器中发出请求时,一切都很顺利。但是,当我在我的设备上运行项目时发出相同的请求时,我遇到了一个令人沮丧的错误。

我知道我无法直接从我的设备连接到本地主机,因此需要使用我的 IP 地址,我正在这样做。这是奇怪的部分:当我向服务器发出请求时,我可以在终端中看到服务器被击中并返回 200 响应。但是,请求失败(在客户端)并显示错误消息:“请求超时。”

信息和代码:

我的 Rails 服务器非常基础。我基本上生成了一个新项目,设置了一个名为“项目”的简单模型,该模型只有一个列——一个字符串——用于项目的内容。我将路由设置为仅响应 JSON 请求,items_controller 上的索引方法仅以 json 形式返回 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 子类 header :

#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(来自另一个示例的在线 URL)并且它工作正常。这让我怀疑它们要么是我的 Rails 服务器有问题,要么是我的本地连接到它的设备有问题。就像我说的,我可以在模拟器上做任何事情,并且可以看到我正在从我的设备访问服务器。

更新 1

似乎无论服务器响应是什么,都会调用 -getPath:parameters:success:failure: 上的失败 block 。也就是说,如果服务器抛出带有错误的 json 表示的 422 响应,我可以在我的设备上获取错误消息。然而,如果服务器返回一个带有其他 json 对象的 200 响应,失败 block 仍然会被抛出……当然没有错误。

最佳答案

AFJSONRequestOperation 将调用失败 block :

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

在所有这些情况下,都会设置error 变量。事实上,正是存在一个 error 导致调用失败 block (参见 [AFJSONRequestOperation -setCompletionBlockWithSuccess:failure:])。

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

无论如何,听起来您的服务器正在返回带有无效 JSON 对象的 HTTP 200。您可以在失败 block 中设置断点,然后在调试器中键入 po operation.responseString 进行检查。

关于iphone - 通过 iOS 设备连接时无法从本地服务器获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17715912/

相关文章:

iOS 如何用另一种语言显示日期,

ruby-on-rails - 在 Rails 控制台中查看种子结果

iOS 警告 : Attempt to dismiss from view controller while a presentation or dismiss is in progress

ruby-on-rails - form_for 和 form_tag,什么时候用哪个?

ruby-on-rails - 如何从格式化数字中删除点

ios - 共享扩展仅显示在 UIActivityViewController 的更多部分下?

iphone - 如何在 iPhone 的照片库中获取照片的名称?

iphone - iOS 通用应用程序 - 访问适用于 iPad 和 iPhone 的不同 Nibs

iphone - 如何读取从 iPhone 中的 sysctlbyname() 检索到的缓冲区数据?

iOS 保存标签中的最高数字。