iPhone上的错误URL,当我在浏览器中输入它时它可以工作

Posted

技术标签:

【中文标题】iPhone上的错误URL,当我在浏览器中输入它时它可以工作【英文标题】:Bad URL on iPhone, when i type it in browser it works 【发布时间】:2013-01-10 15:38:39 【问题描述】:

我正在制作一个 jsonstring。当我执行它时,当我在浏览器中执行它时它就可以工作。我通过记录确切的 url 并将其复制到浏览器中来做到这一点。比我得到我想要的 HTTP Get,但在 iPhone 中我只得到一个错误的登录。

- (IBAction)getDown:(id)sender  //perform get request
    NSLog(@"beginnen met versturen");

    //NSString * _barCode = [[NSUserDefaults standardUserDefaults] objectForKey:@"phoneNumber"];

    //build up the request that is to be sent to the server
    //NSString*jsonString = [[NSString alloc] initWithFormat:@"\"barcode\":\"%@\"", _barCode];


    NSString*jsonString = [[NSString alloc] initWithFormat:@"\"barcode\":\"123456\""];

    NSString *str = [NSString stringWithFormat: @"http://server.nl/scan.php?data=%@",jsonString];
    NSLog(@"%@", str);
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL    URLWithString:str]];
    NSLog(@"url: %@", request);

    [request setHTTPMethod:@"GET"];
   // [request addValue:@"getValues" forHTTPHeaderField:@"METHOD"]; //selects what task the server will perform
    NSLog(@"met value: %@", request);

    //initialize an NSURLConnection  with the request
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if(!connection)
        NSLog(@"Connection Failed");
    



-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data // executed when the connection receives data

    receivedData = data;
    /* NOTE: if you are working with large data , it may be better to set recievedData as NSMutableData
     and use  [receivedData append:Data] here, in this event you should also set recievedData to nil
     when you are done working with it or any new data received could end up just appending to the
     last message received*/

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error //executed when the connection fails

    NSLog(@"Connection failed with error: %@",error.localizedDescription);

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

    /*This message is sent when there is an authentication challenge ,our server does not have this requirement so we do not need to handle that here*/

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

    NSLog(@"Request Complete,recieved %d bytes of data",receivedData.length);

    //[self.delegate requestReturnedData:receivedData];//send the data to the delegate
    NSData *data = receivedData;
    NSDictionary *dictionary = [NSDictionary dictionaryWithJSONData:data];
    NSLog(@"%@",dictionary.JSONString ); ; // set the textview to the raw string value of the data recieved

    NSString *value1 = [dictionary objectForKey:@"barcode"];
    NSLog(@"%@", value1);
    NSString *value2 = [dictionary objectForKey:@"product"];
    NSLog(@"%@",dictionary);
    NSLog(@"%@", value2);


这是日志:

2013-01-10 16:31:46.550 Scanner[14875:907] http://server.nl/scan.php?data="barcode":"123456"
2013-01-10 16:31:46.551 Scanner[14875:907] url: <NSMutableURLRequest (null)>
2013-01-10 16:31:46.553 Scanner[14875:907] met value: <NSMutableURLRequest (null)>
**2013-01-10 16:31:46.556 Scanner[14875:907] Connection failed with error: bad URL**

当我从字符串中删除完整的 json 时,我没有得到错误的 url。所以可能有问题。有谁知道我做错了什么?

【问题讨论】:

【参考方案1】:

在执行 URL 请求之前,您需要对其进行编码。 最好和最优雅的解决方案是在 NSString 上添加一个类别,例如:

- (NSString*)URLEncode 
    // Should not be encoded:-_.
    return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR(";/?:@&=+$,!*'()<>#%\"|\\^[]`~"), kCFStringEncodingUTF8) autorelease];
//

当你提出请求时:

NSString *str = [NSString stringWithFormat: @"http://server.nl/scan.php?data=%@",jsonString];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL    URLWithString:[str URLEncode]];

如果您不想使用其他文件(甚至认为会推荐),请将此方法添加到您的类中:

- (NSString*)URLEncode:(NSString )yourURL 
 // Should not be encoded:-_. 
return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR(";/?:@&=+$,!'()<>#%\"|\\^[]`~"), kCFStringEncodingUTF8) autorelease]; 
 

并使用

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[self URLEncode:str]]; 

【讨论】:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[str URLEncode]]]; 您需要包含您创建的分类的标题。 等等什么?你能给我解释一下吗? 更简单的是,只需在你的类中做一个实例方法,像这样 - (NSString*)URLEncode:(NSString )yourURL // 不应该编码:-_. return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR(";/?:@&=+$,!'()#%\"|\\^ []`~"), kCFStringEncodingUTF8) autorelease]; 并使用 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[self URLEncode:str]]; 如果您不想在项目中添加其他文件。但是,我建议使用我在回复中发布的方法。 您能在答案中编辑它吗?我看不到这样的【参考方案2】:

我现在没有太多信息,抱歉,我有点着急,刚刚看到你的问题。但是我看到了你的问题,我记得在一个项目上工作,该项目本质上是一个基于 html 的 iphone 遥控器,当用户点击遥控器的一些按钮时,它遵循打开相同页面但有指示服务器暂停、播放、停止等的服务器端代码……我记得 iPhone 有一个错误,导致它无法解析我的所有 URL,即使它们的格式和工作都正确在桌面客户端上。这就是我切换到 POST 请求的原因(用户点击而不是激活设置隐藏表单变量的 javascript 函数,然后提交表单,而不是直接导航到长 URL)。无论如何,我知道这可能并不直接适用于你,但关键是我确实在 iPhone 的 URL 解析中发现了一个错误,所以这可能不是你的错。稍后我会查找我能找到的任何新信息。祝你好运。

【讨论】:

以上是关于iPhone上的错误URL,当我在浏览器中输入它时它可以工作的主要内容,如果未能解决你的问题,请参考以下文章

PHP 从 URL 获取数据

iPhone 4 和模拟器上的 Facebook 登录失败

为啥此页面与移动浏览器不兼容?

iPhone 与 iPad/浏览器上的 HTML5 内嵌视频

如何使用 Easeljs 处理 iPhone 上的快速点击?

灰线出现在我在 iPhone 上的输入字段中