I need to login here. I've tried the ASIHTTPRequest and ASIFormDataRequest.
None of them works as expected. I only got the data from the loginpage in the response string, not the data from the secure area.
What am I doing wrong here?
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:#"https://www.blau.de/"]];
[request setPostValue:#"USERNAME" forKey:#"quickLoginNumber"];
[request setPostValue:#"PASSWORD" forKey:#"quickLoginPassword"];
[request startAsynchronous];
There are a couple of good tools you can use to try to debug this. In all likelihood there is a 302 redirect after logging in. You can watch for that (among other conditions) using tools such as:
HTTPScoop (worth the $15 bux): http://www.tuffcode.com/
Live Headers (a free FireFox plugin): https://addons.mozilla.org/en-US/firefox/addon/3829/
Keep in mind that what you're trying to do is not simple. I've gotten it to work with some sites, but not others and the reasons for one or the other can be quite elusive.
Related
As soon as, I send request to the server (via NSURLConnection sendSynchronousRequest method), the server receives it in about 2 seconds, it processes and sends back response in another 3-5 seconds. However, I only get back the response in 30-35 seconds. This delay makes our communication very slow.
Even the async APIs are getting a delayed response.
Earlier, everything was working fine, with client getting the response back within 10 seconds.
Anyone else having this issue? What could be the reason?
EDIT
here is a screenshot of Wireshark analysis:
Link to a better image
How should I see what packet is saying what?..and why is it getting delayed?
EDIT2
Here is the code:
NSHTTPURLResponse *response=nil;
NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:nsURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:180.0];
[theRequest setHTTPMethod:#"POST"];
[theRequest setTimeoutInterval:180.0];
[theRequest setHTTPBody:[[NSString stringWithFormat:#"%#",sdata] dataUsingEncoding:NSASCIIStringEncoding]];
NSError *error= nil;
NSData *result = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error];
if (error ) {
NSLog(#"error sending synchronous request: %#", error);
}
NSLog(#"request completed with code:%d",response.statusCode);
I'd avoid calling sendSynchronousRequest. Use the asynchronous version instead if you're not doing the call already on a background thread (you don't want to block the UI thread).
How do you know when the iOS response is received? An NSLog? A UI state change?
See also these questions:
NSURLConnection sendSynchronousRequest - background to foreground
NSURLConnection sendSynchronousRequest taking too much time to respond
Update
If you're a bit stuck, one strategy might be to rule out the use of NSURLConnection as the problem.
Strategy 1: try using NSURL's asychronous connection call instead of synchronous
Strategy 2: try using a different HTTP lib, such as AFNetworking
If you want to take a closer look at what is going on with the HTTP connection, you can use tools such as Charles, Fiddler or Wireshark to debug what data is being sent and received. To get the most benefit from this sort of analysis, you need to have some knowledge of the HTTP protocol(s). This is probably more time consuming than the previously mentioned strategies.
See also questions such as How to monitor network calls made from iOS Simulator.
Update
Are you accessing a webserver of your own, or is it someone else's?
Have you had a close look at the headers being sent to your webserver (and the ones being returned)? Pay attention to the content length, for example. Wrong content length can cause a delay, as explained here.
To see the request and returned headers, you could use Firebug, or something like wget or curl on the command line.
Also, double check that there's not a newline on the end of your URL, as described here.
Solution that worked for me:
In the request headers, iOS sets "gzip" for "Accept-Encoding" by default. The gzip compression was taking a lot of time, and hence the delayed response. I did the following to solve the problem:
[theRequest setValue:#"" forHTTPHeaderField:#"Accept-Encoding"];
NOTE: Check your headers, for any response delay.
Thanks to #occulus for directing me to the request headers!
You do this over wifi or celluar?
Speaking from my experience, when my data useage is exeeded my phone-provider slows down my downloads. Sometimes this happen to me at the end of the month after I did use a lot of mobile data.
I am not sure to say but it may be network problem first check it. it proper or down ?? okay Maybe I will be wrong.. but first check it...
Following describe code it might solve your problem :)
NSString *url = #"Your URL ";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
[request setHTTPMethod:#"POST"];
NSMutableData *body = [NSMutableData data];
.
.
/// Add Here Your NSMutableData Valuew
.
.
[request setHTTPBody:body];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (theConnection)
{
self.responseData = [[NSMutableData alloc] init];
}
else
NSLog(#"Connection Failed!");
To ease your problems with asynchronous HTTP Request you should consider using the AFNetworking framework
iam using to download multiple file using by pass ASIHTTPRequest to operation queue...
NSInvocationOperation *operation =[[NSInvocationOperation alloc]initWithTarget:self selector:#selector(DownloadFile:) object:url];
.
.
.
-(void)DownloadFile:(NSURL)url{
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadProgressDelegate:self];
[request setDidFailSelector:#selector(requestWentWrong:)];
[request setDidFinishSelector:#selector(requestFinished:)];
[request setDelegate:self];
[request startSynchronous];
}
- (void)setProgress:(float)progress{
NSLog(#"Current progress %f :",progress);
}
The progress is working fine but i can't know from which URL or from which operation..
I want to know how to get each download progress of each url individually...
and how i cancel each one not cancel all operations.
Thanks
First an answer to your question: how about you create one "delegate" object for each download? Then it's obvious how download progresses for each download and cancel is easy, too. The code will be more complicated, though.
Therefore I have another suggestion: the author of ASIHTTPRequest library has stopped developing the library, so you might switch to something else. He's suggestion for example AFNetworking, but many people recommend nowadays MKNetworkKit. It seems to have pretty good queue handling.
Note the signature of the delegate messages: Each one takes an argument. That argument is the request sending you the message: The request, when it sends you a delegate message, includes itself among the arguments so that you know which request has gotten that far.
I'm trying to send out a very simple ASIHTTPRequest with https. Although I have set the validatesSecureCertificate flag to "NO", I still get an odd response for my request:
A connection failure occurred: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)
The code I am using is pretty straightforward, I am removing the actual parameters for security reasons:
NSURL *url = [NSURL URLWithString:#"https://secured.cet.ac.il/KotarServices/getMyBooks.aspx?username=xxxxxxxx&password=xxxxx&packageid=x"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDidFailSelector:#selector(getMyBooksFailedWithError:)];
[request setDidFinishSelector:#selector(getMyBooksFinishedWithResult:)];
[request setDelegate:self];
[request setValidatesSecureCertificate:NO];
[request startAsynchronous];
Digging deeper into the code, I see that the request fails on a "-9807" error code, which is related only to the operating system and has nothing to do with the server I am interacting with (SecureTransport.h maps this out to be "invalid certificate chain"). Any ideas how to overcome this issue? Thanks in advance.
I remember i had a similar problem with a GoDaddy certificate and had to make the following change in ASIHTTPRequest.m, below the comment "Handle SSL certificate settings", inside the if(![self validatesSecureCertificate]), around line 1160:
[sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
I ran into this with a GoDaddy certificate I just bought today. One correction to trydis's solution: I think you want this outside the if(![self validatesSecureCertificate]), since you actually want to validate the certificate. As the comment says, stuff inside the if clause "tells CFNetwork not to validate SSL certificates". TBH, I have no idea why the GoDaddy certificate is being interpreted by the client as a root certificate, which is what's necessitating this change in the first place.
I am creating my first iPad app. I have a web application that I would like to authenticate against and pull data from in a RESTful way.
If you open up the URL in the browser (https://myapp.com/auth/login), you will get a form to enter your username and password. I was thinking I could set the login credentials in the post data of the request and submit the data.
The site uses HTTPS for login so that credentials aren't passed in plain text over the internet.
How can I make a secure HTTPS connection to pass credentials? Will this remember that I am logged in for future requests? What is the best way to do this?
Further update, October 2013
Although at the time I wrote this answer, ASIHTTPRequest was maintained a widely supported, this is no longer the case. It is not recommended for new projects - instead use NSURLConnection directly, or use AFNetworking.
With AFNetworking, there is a [httpClient setAuthorizationHeaderWithUsername:username password:password]; method for http authentication, and create a POST style form is equally easy - see AFNetworking Post Request for that.
Original answer:
A lot of people use the ASIHTTPRequest class to deal with http & https on the iPhone/iPad, as it has a lot of useful features that are difficult or time consuming to achieve with the built in classes:
http://allseeing-i.com/ASIHTTPRequest/
Starting at the simplest level you'd start with something like:
NSURL *url = [NSURL URLWithString:#"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
NSLog(#"response = %#", response);
}
If you're using HTTP authentication, ASIHTTPRequest will automatically prompt the user for the username and password.
IF you're using some other form of authentication you probably need to request the username and password from the user yourself, and submit them as a POST value or a custom http header, and then the response may either include a token in a JSON or XML response, or it could set a cookie.
If you add more details as to how the authentication scheme works I can be a bit more specific.
Update
Based on the update, to emulate a POST form you'd just need to add lines like:
[request addPostValue:usernameString forKey:#"username"];
[request addPostValue:passwordString forKey:#"password"];
You will also need to change the way you create the request, instead of:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
do:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
(I also forget to mention it above, there's code I put earlier is using a synchronous request, so you'd want to replace it with an asynchronous one to avoid blocking the UI once you'd proved it was working.)
There's a JSON framework for the iphone here:
http://code.google.com/p/json-framework/
which works well for me and is simple to use with ASIHTTPRequest.
Hi I am currently designing my second iphone app, and having a small issue.
I have the location code working correctly but I have no idea how to send the label with the location info to my server.
I was wondering and hoping someone might be able to help.
Thanks
Russell
That would depend entirely on what your PHP script expects to receive. Your most obvious choices would be to put the coordinates in the query string or in a POST request.
Use ASIHTTPRequest for http requests. http://allseeing-i.com/ASIHTTPRequest/
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:#"Josh" forKey:#"first_name"];
[request setPostValue:#"Highland" forKey:#"last_name"];
[request start];