Objective-C - Formatting GET request - objective-c

What are the rules for passing the string parameter such as %JOHN% in a GET request url
my request url is supposed to look like: https://somesite.com/search/name?name=%SEARCH_KEYWORD%
Try#1: I did this
NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:#"https://somesite.com/search/name?name=%%%#%%",SEARCH_KEYWORD]];
O/P: nil
Try#2:
NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:#"https://somesite.com/search/name?name=%JOE%"]];
**O/P:
https://somesite.com/search/name?name=JOE
Any suggestions?

You can use NSURLComponents to build URLs:
Objective-C:
NSURLComponents *components = [NSURLComponents componentsWithString:#"https://google.com"];
components.query = #"s=%search keywords%"
NSURL *url = components.URL;
Swift (careful with ! in production, I used to test in Playgrounds):
let components = NSURLComponents(string: "https://google.com")!
components = "s=%search keywords%"
let url = components!
print(url) // "https://google.com?s=%25search%20keywords%25"
Also if you need more complex queries NSURLComponent have a queryItems property.

You are making a mistake, just use a single %#.
Example:
NSString *string = #"JOE";
NSURL *url = [[NSURL alloc] initWithString:[NSString stringWithFormat:#"https://somesite.com/search/name?name=%#",string]];

Related

i want to take only simple url without http://

i want to add "http://" inside code so that user find it easy to browse by only typing a simple url
i have tried
- (IBAction)uurl:(id)sender {
NSURL *myurl = [NSURL URLWithString : #"http://"];
}
but its not working
//This is what the user types, depending on the type of input you use
NSString *urlString = #"www.bla.com";
NSString *httpString = #"http://";
urlString = [httpString stringByAppendingString:urlString];
//OR urlString = [NSString stringWithFormat:#"http://%#",urlString];
NSURL *url = [NSURL URLWithString:urlString];
Right this is simple enough to do but we need to check as well if the user inputs the http:// or https:// themselves. So see below with explanation in comments
- (IBAction)uurl:(id)sender
{
// Our to NSStrings that we want to be checking for.
static NSString *httpsStr = #"https://";
static NSString *httpStr = #"http://";
NSString *urlStr = #"www.google.com"; // User input however you take this
// Our check to make sure that the urlStr passed in does already have http or https
if(![urlStr hasPrefix:httpsStr] && ![urlStr hasPrefix:httpStr]) {
// If it doesn't have anything our default HTTP Protocol will be http
urlStr = [NSString stringWithFormat:#"http://%#", urlStr];
}
// If the user has entered the http or https themselves ignore reseting to http
// Set our urlStr as the URL we want to use.
NSURL *url = [NSURL URLWithString:urlStr];
// At this point you would do whatever it is you want to do with the url
}
Use -initWithScheme:host:path:
// your user input string
NSString *userString = #"www.apple.com";
NSURL *yourURL;
if (![userString hasPrefix:#"http://"])
yourURL = [[NSURL alloc] initWithScheme:#"http" host:userString path:#"/"];
else
yourURL = [[NSURL alloc] initWithString:userString];

Parsing NSURL in Objective-C

I have an NSTextView control that could potentially have links in it. How do I get the full url of the link?
Here is what I have so far
-(BOOL)textView:(NSTextView *)aTextView clickedOnLink:(id)aLink atIndex:(NSUInteger)charIndex
{
NSURL *htmlURL = [NSURL fileURLWithPathComponents:[aLink pathComponents]];
}
This gives me a URL that begins with file://localhost ... How do I get rid of that portion of the URL?
NSURL* url = [NSURL URLWithString:#"http://localhost/myweb/index.html"];
NSString* reducedUrl = [NSString stringWithFormat:
#"%#://%#",
url.scheme,
[url.pathComponents objectAtIndex:1]];

How do I add format specifiers to NSURL

I have the following code that makes a Google Places API request. The parameters are statically set at the moment. How would I go about making those parameters (types and lat/lon and the Google Key - which I've defined as a constant in the .h file) objects instead?
My problem arises with the NSURL because I can't add format specifiers to it.
thanks for any help.
-(void)ParseXML_of_Google_PlacesAPI
{
NSURL *googlePlacesURL = [NSURL URLWithString:#"https://maps.googleapis.com/maps/api/place/search/xml?location=34.0522222,-118.2427778&radius=500&types=bar&sensor=false&key=MyGoogleAPIKey"];
NSData *xmlData = [NSData dataWithContentsOfURL:googlePlacesURL];
xmlDocument = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:nil];
NSArray *arr = [xmlDocument.rootElement elementsForName:#"result"];
for(GDataXMLElement *e in arr )
{
[placesOutputArray addObject:e];
}
Good ol' stringWithFormat?
`NSString* urlToCall = [NSString stringWithFormat:#"http:://url.to.webservice/api?param1=%#&param2=%#", param1, param2]`
This may be helpful for you
float lat=34.0522222,lon=-118.2427778;
NSString *typestr=#"bar";
NSString *key=#"MyGoogleAPIKey";
NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:#"https://maps.googleapis.com/maps/api/place/search/xml?location=%f,%f&radius=500&types=%#&sensor=false&key=%#",lat,lon,typestr,key]];
NSLog(#"url values ==%#",url);
Format specifiers directly to NSURL like this:
NSURL *googlePlacesURL = [NSURL URLWithString:[NSString stringWithFormat:#"http:://url.to.webservice/api?param1=%#%param2=%#", param1, param2]];

Drag&Drop NSURL without "file://"

I'm implementing my drag&drop method. I need that when user drags something on my app window I can get that file URL. NSURL needs to be converted to char. Thats OK. But how to remove file:// from url? My current code:
pboard = [sender draggingPasteboard];
NSString *url = [[NSURL URLFromPasteboard:pboard] absoluteString];
input_imageN = strdup([url UTF8String]);
its OK, but it gives url with file:// prefix. I tried using
NSURL *fileUrl = [[NSURL URLFromPasteboard:pboard] isFileURL];
NSString *url = [fileUrl absoluteString];
NSLog(#"url: %#", [NSURL URLFromPasteboard:pboard]);
input_imageN = strdup([url UTF8String]);
but it says that
Cannot initialize a variable of type 'NSURL *' with an rvalue of type 'BOOL' (aka 'signed char')
at
NSURL *fileUrl = [[NSURL URLFromPasteboard:pboard] isFileURL];
To go from a file URL to the path as a C string in the appropriate representation for the filesystem, you'd do:
NSURL *fileURL = [NSURL URLFromPasteboard: pboard];
NSString *filePath = [fileURL path];
char *filesystemRepresentation = [filePath filesystemRepresentation];
This avoids assumptions that stripping off the scheme leaves you with just the path, or that the filesystem is definitely happy accepting UTF8-encoded paths.
url = [url stringByReplacingOccurencesOfString:#"file://" withString:#""];
Hope this helps. Cheers!
#user23743's answer is correct. Since iOS 7 though NSURL has its own filestSystemRepresentation method.
In Swift:
if let fileURL = NSURL(fromPasteboard: pboard) {
let representation = fileURL.fileSystemRepresentation
}
if let fileURL = NSURL(from: pboard)?.filePathURL {
}
has been most effective for me.

How to download file from particular url?

NSURL * url = #"http://192.168.100.161/UploadWhiteB/wh.txt";
NSData * data = [NSData dataWithContentsOfURL:url];
if (data != nil) {
NSLog(#"\nis not nil");
NSString *readdata = [[NSString alloc] initWithContentsOfURL:(NSData *)data ];
I write this code to download a file from given url... but i get an error on line
NSData * data = [NSData dataWithContentsOfURL:url];
uncaught exception...
so please help me out.
Your first line should be
NSURL * url = [NSURL URLWithString:#"http://192.168.100.161/UploadWhiteB/wh.txt"];
(NSURL is not a string, but can easily be constructed from one.)
I'd expect you to get a compiler warning on your first line--ignoring compiler warnings is bad. The second line fails because dataWithContentsOfURL: expects to be given a pointer to an NSURL object and while you're passing it a pointer that you've typed NSURL*, url is actually pointing to an NSString object.
NSString *file = #"http://192.168.100.161/UploadWhiteB/wh.txt";
NSURL *fileURL = [NSURL URLWithString:file];
NSLog(#"qqqqq.....%#",fileURL);
NSData *fileData = [[NSData alloc] initWithContentsOfURL:fileURL];
-[NSString initWithContentsOfURL:] is deprecated. You should be using -[NSString (id)initWithContentsOfURL:encoding:error:]. In either case, the URL paramter is an NSURL instance, not an NSData instance. Of course you get an error trying to initialize a string with the wrong type. You can initialize the string with the URL data using -[NSString initWithData:encoding:], or just initialize the string directly from the URL.