草庐IT

ios - 如果通过 iOS 客户端发送请求,则无法识别参数,Curl 相同的 url 按预期工作

coder 2024-01-25 原文

所以我从 iOS 应用向我的服务器发出 GET 请求。我得到的响应是一个空数组,但我希望得到一些数据。我将 Curl 用于相同的 url(从日志中复制粘贴),我得到了一些数据,所以可能是我的应用程序。但是当我更改 url 并尝试记录响应时,我确实收到了一个响应,表明我的应用程序正常。现在我不知道该怎么办。

我的服务器是一个 Rails 应用程序。这是代码:

  def search
  @query = params[:user]
  q="%#{@query}%"
  users = []

  @users = User.where("username like ?", q)
  for user in @users
    if (user.avatar)
      users << {username: user.username, avatar: user.avatar.image.thumbnail_dp}
    else
      users << {username: user.username, avatar: ""}
    end
  end
  respond_to do |format|
      format.json {render :json => users.to_json }
  end
end

这是我的 objective-c 代码

-(void)getFriends:(NSString *)query{

  Keychain *keychain = [[Keychain alloc]init];
  NSString *authToken = [keychain getAuthToken];
  NSString *url = @"http://url.json";
  NSString *urlString = [NSString stringWithFormat:@"%@?user=%@", url, query ];
  NSURL *main_url = [NSURL URLWithString:urlString];
  NSLog(@"url = %@", main_url);
  self.remote_response = [[NSMutableData alloc] init];

  NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
  [request setURL: main_url];
  [request setHTTPMethod:@"GET"];
  [request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];
  [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
  [request setValue:authToken forHTTPHeaderField:@"X-AUTH-TOKEN"];
  NSLog(@"request ===%@", request);
  self.remote_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
  [self.remote_connection start];
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

委托(delegate)方法如下:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    [self.remote_response setLength:0];
    NSLog(@"DID RECEIVE RESPONSE");
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error"
                                               message:(@"Could not get friends with error %@", error)
                                              delegate:self
                                     cancelButtonTitle:@"Ok"
                                     otherButtonTitles:nil , nil];
   [alert show];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
    [self.remote_response appendData:d];
    NSLog(@"Did receive data");
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSError *error;
    NSString *responseText = [[NSString alloc] initWithData:self.remote_response
                                               encoding:NSUTF8StringEncoding];
    NSData *data = [responseText dataUsingEncoding:NSASCIIStringEncoding];
    NSLog(@"Response ==> %@", responseText);
    NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data
                                                                   options:NSJSONReadingMutableContainers error:&error];
    if([responseDictionary count]>0){
         NSLog(@"Response::::%@", responseDictionary);

    }
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

这是我得到的 NSURLResponse 日志

DID RECEIVE RESPONSE
Did receive data
Response ==> []

编辑::: 发现了什么。没有设置参数我不知道为什么当我 NSLog 时,我看到了参数。

如果我 curl 它,这是日志

2013-09-05T07:30:58.222613+00:00 app[web.1]:Started GET "/search.json?user=heeman" for 58.137.173.76 at 2013-09-05 07:30:58 +0000
2013-09-05T07:30:58.428178+00:00 app[web.1]: Processing by UsersController#search as JSON
2013-09-05T07:30:58.428178+00:00 app[web.1]:   Parameters: {"user"=>"heeman"}
2013-09-05T07:30:58.428178+00:00 app[web.1]: Completed 200 OK in 200ms (Views: 0.1ms | ActiveRecord: 7.5ms)

这是通过我的 ios 客户端的日志

2013-09-05T07:35:35.766319+00:00 app[web.1]: Started GET "/search.json?user=heeman" for      58.137.173.76 at 2013-09-05 07:35:35 +0000
2013-09-05T07:35:35.778962+00:00 heroku[router]: at=info method=GET path=/search.json?user=heeman host="host" fwd="58.137.173.76" dyno=web.1 connect=1ms service=51ms status=304 bytes=0
2013-09-05T07:35:35.773667+00:00 app[web.1]: Processing by UsersController#search as JSON
2013-09-05T07:35:35.773667+00:00 app[web.1]:   Parameters: {"user"=>{}}
2013-09-05T07:35:35.773667+00:00 app[web.1]: Completed 200 OK in 3ms (Views: 0.2ms | ActiveRecord: 1.2ms)

如果您在日志中看到,该 url 确实显示了参数 method=GET path=/search.json?user=heeman 但是 Parameters: {"user"=>{ }}

最佳答案

删除请求中的 Content-type 设置。您不包括任何数据主体,只包括参数,因为这是 GET,而不是 PUT 或 POST。 GET 请求不应包含 Content-type(它们应该只包含 Accept),但这不是硬性要求,它的影响取决于服务器处理请求。

关于ios - 如果通过 iOS 客户端发送请求,则无法识别参数,Curl 相同的 url 按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18629605/

有关ios - 如果通过 iOS 客户端发送请求,则无法识别参数,Curl 相同的 url 按预期工作的更多相关文章

  1. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  4. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  7. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  8. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  9. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  10. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

随机推荐