How to pass an HTML string in a Query String in IOS - html

I have a simple IOS application that I created for consultants where I work. It has a custom keyboard with notation that they use that includes superscript and subscript characters. The easiest way that I found to handle those characters was using HTML and a WebView, which works just fine.
I am now attempting to send this information to a web application that will insert it into a SQL database. Sending all of the other information works just fine, until I get to the transcript with HTML in it. I am encoding each of the values that I send through the query string with stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding but the query string fails when HTML elements are included. I believe this is due to the / that is not removed during the escape encoding. For example the HTML break tag becomes %3Cbr%20/%3E. So the < > and space are replaced, but not the /.
Should I be using a different method? Is there an easy way to send HTML over Query String? Am I correct that the / character is what is breaking my query string?
Here is the code I have now:
NSString *datePE =[dateString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *studentPE =[student stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *teacherPE =[teacher stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *transcriberPE =[transcriber stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *vrPE =[vrTextField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *totalTimePE =[totalTimeString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *transcriptPE =[transcriptString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
parameters = [NSString stringWithFormat:#"dateQS=%#&studentQS=%#&teacherQS=%#&transcriberQS=%#&vrQS=%#&totalTimeQS=%#&transcriptQS=%#",datePE ,studentPE,teacherPE,transcriberPE,vrPE,totalTimePE, transcriptPE];
request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:#"http://server.domain.net/folder/subfolder/Default.aspx?"]];
[request setHTTPMethod:#"POST"];
[request setHTTPBody:[parameters dataUsingEncoding:NSUTF8StringEncoding]];
connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];

Related

Encoded NSData for a url not saving to the documents directory

I'm trying to save a html page locally on the iPhone's documents directory so I can load the page if the phone is in an offline state
My issue is when I call my NSData object directly to be written to file all the raw data is saved in a file in the documents directory.
But as soon as I cast my NSData to a NSString using encoding it stops writing the file in the documents directory. But when I print my content object it logs out the correct data. I just want that to be saved to a file.
NSURL *url = [NSURL URLWithString:#"http://anyurl"];
NSData *urlHtmlData = [NSData dataWithContentsOfURL:url];
NSString *myString = [[NSString alloc]initWithData:urlHtmlData encoding:NSUTF8StringEncoding];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:#"index.html"];
[myString writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];
What could be causing the content to stop writing to my file?
Or if anyones got a better solution to view offline webpages rather than saving it to the documents directory?
Thanks
There could be a few things wrong with this. One: You don't use stringWithFormat: to append a path component. NSString has a method for that:
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:#"index.html"];
Two: NSStringEncodingConversionAllowLossy is part of an enum that is not defined for writeToFile:, so by using it, you're actually specifying NSASCIIStringEncoding without realizing it. In my opinion, just use NSUTF8StringEncoding instead.
Also, NSString *content = [[NSString alloc]initWithFormat:#"%#", myString]; does absolutely nothing except duplicate myString. Erase that line and just use [myString writeToFile:....

App is STILL not updating database when string contains spaces

Slowly but surely I think I'm going mad. After getting the solution to my problem and the app now also accepting spaces, it still won't add the data that contains spaces to my mysql database. Here is the code:
NSString *strURL = [NSString stringWithFormat:#"http://www.bbc.com/phpFile.php?number=%#&name=%#&lastname=%#", number, firstName, lastName];
NSString *webStringURl = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(#"%#", strResult);
NSLog(#"%#", webStringURl);
NSLog even tells me that it does exactly what I tell him to:
ProjectX[4003:15203] http://www.bbc.com/phpFile.php?number=11166&name=Yong%20Wang%20Ding&lastname=Blamblam
It works everytime when the variables do not contain spaces. When I open the php file in my browser and enter the variables by hand (with spaces) it adds them to my database. I have no clue why it refuses to work when doing exactly(?) the same thing with my app.
It doesn't look like you're using webStringURl (sic) anywhere other than in the final NSLog statement. Are you sure you didn't mean to write:
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:webStringURl];
...for the third line?
At the moment, you're calling dataWithContentsOfURL on your unescaped version of the URL (which may still contain spaces).

App is not updating database when string contains spaces

I ran into a weird problem. I built a mysql database where the user can store his contacts through an app. He just adds his contact information by clicking on a button. Then, the data is added to the database.
However, when the contact's information has spaces between his first name, last name or number the app refuses to accept the data. I dont get an error message or anything like that, but I also dont get any confirmation. The record does not exist in the database.
There is no problem with my php file (The file is definitely correct, I got it checked here, twice).
Here is my code:
NSString *strURL = [NSString stringWithFormat:#"http://www.abc.com/phpFile.php?number=%#&name=%#&lastname=%#", number, firstName, lastName];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(#"%#", strResult);
The space character is not allowed in a URI. Use %20 to encode the space. There are other characters that are also not allowed as part of the URI. Look up URI encoding.
NSString *strURL = [NSString stringWithFormat:#"http://www.abc.com/phpFile.php?number=%#&name=%#&lastname=%#", number, firstName, lastName];
strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(#"%#", strResult);

ASIFormDataRequest JSON encoding issues

I seem to have run into a rather trivia issue that I can't figure out. I am using ASIFormDataRequest for interacting with my Ruby on Rails app. I have a REST API that accepts a User object. I am using JSONKit to get the JSONString from a NSDictionary.
However, when I do a
[request setPostValue:[userObj JSONString] forKey:#"user"];
The request on the server side ends up escaping the quotes. Basically,
{"password":"hello","name":"user","email":"user#foo.com"}
TO
"{\"password\":\"hello\",\"name\":\"user\",\"email\":\"user#foo.com\"}"
This ends up confusing rails and it complains of an invalid object. Can I force ASIFormDataRequest to not escape the quotes? I understand this might be an issue with the JSONString itself but I can't figure out a good solution here.
Thanks
This is what worked for me:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
NSDictionary* inner = [[NSDictionary alloc] initWithObjectsAndKeys:username, #"login",password, #"password", nil];
NSDictionary* user = [[NSDictionary alloc] initWithObjectsAndKeys:inner, #"user", nil];
NSMutableData *requestBody = [[NSMutableData alloc] initWithData:[[user JSONString] dataUsingEncoding:NSUTF8StringEncoding]];
[request addRequestHeader:#"Content-Type" value:#"application/json; encoding=utf-8"];
[request addRequestHeader:#"Accept" value:#"application/json"];
[request setRequestMethod:#"POST"];
[request setPostBody:requestBody];
[request startAsynchronous];
It's not usual to mix ASIFormDataRequest and JSON - normally people encode things in the HTML form data format or they encode in JSON format. Not both!
Could you consider using pure JSON in this case? It might well make your life easier. Basically you would use an ASIHTTPRequest instead of an ASIFormDataRequest, and set it up like this:
NSString *postData = [userObj JSONString];
[request addRequestHeader: #"Content-Type" value: #"application/json; charset=utf-8"];
[request appendPostData:[postData dataUsingEncoding:NSUTF8StringEncoding]];
Aside from that, it's not really clear why it's going wrong - can you use something like wireshark to capture the raw text of the http request you're sending and add that to your question?
How are you extracting the JSON data from the form data on the Ruby side?

how to escape string for UIWebView?

I pull json data from a server. It contains a dictionary with text that I insert into a html template.
How do I properly escape this string?
NSString* json = /* can be anything, but also garbage */
NSString* json_escaped = [json someEscapeMethod]; /////// HOW TO ESCAPE THIS ?
NSString* script = [NSString stringWithFormat:#"process('%#')", json_escaped];
NSString* result = [self.webView stringByEvaluatingJavaScriptFromString:script];
I currently do like this, but I'm not sure wether the escaping is sufficiently
NSString* json_escaped = [json stringByReplacingOccurrencesOfString:#"'" withString:#"\\'"];
I now encode it this way, but the overhead is huge.
NSString* json = /* can be anything, but also garbage */
NSString* json_escaped = [json stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString* script = [NSString stringWithFormat:#"process('%#')", json_escaped];
NSString* result = [self.webView stringByEvaluatingJavaScriptFromString:script];
And decode it in javascript like this
function process(json_escaped) {
var json = decodeURIComponent(json_escaped);
alert('json: ' + json.toString());
}
I'm still looking for a better solution with less overhead.
Update
I have recently learned that there exists several frameworks for bridging objective-c with javascript.
The "Escaping Characters in a String" section of NSRegularExpression may work.