2

私はjsonstringを作っています。実行すると、ブラウザで実行すると機能します。これを行うには、正確な URL をログに記録し、それをブラウザーにコピーします。必要なHTTP Getを取得するよりも、iPhoneではBad Loginしか取得しません。

- (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は取得されません。そのため、問題がある可能性があります。誰が私が間違っているのか知っていますか?

4

2 に答える 2

3

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]]; 
于 2013-01-10T15:44:21.830 に答える
1

現在、あまり情報がありません。申し訳ありません。少し急いでいて、あなたの質問を見たところです。しかし、私はあなたの質問を見て、本質的に HTML ベースの iphone 用リモコンであるプロジェクトに取り組んでいたことを覚えています。ユーザーがリモコンのいくつかのボタンをクリックすると、同じページを開く URL をたどりましたが、サーバーに一時停止、再生、停止などを指示するサーバー側コード... iPhone にはバグがあり、URL が正しくフォーマットされ、機能していたにもかかわらず、すべての URL を解析できなかったのを覚えています。デスクトップクライアントで。そのため、POST リクエストに切り替えました (ユーザーがクリックすると、長い URL に直接移動するのではなく、非表示のフォーム変数を設定する JavaScript 関数がアクティブになり、フォームが送信されます)。いずれかの方法、これがあなたに直接当てはまるわけではないことはわかっていますが、ポイントは、iPhone の URL 解析でバグを見つけたということです。したがって、それはあなたのせいではないかもしれません。新しい情報があれば、後で調べてみます。幸運を。

于 2013-01-10T15:44:49.363 に答える