I have an app which communicates with the server. I need to send a message id to the server. I am using NSMutableURL Request. However, I am getting a 405 error while submitting the request.
Below is the code
messageid=@"1234";
NSURL *aUrl = [NSURL URLWithString:@"http://myexample.com:8080/Padua/rest/messages/messagetodelete"];
NSMutableURLRequest *deleterequest = [NSMutableURLRequest requestWithURL:aUrl
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:deleterequest
delegate:self];
[deleterequest setHTTPMethod:@"POST"];
[deleterequest setValue:[NSString stringWithFormat:@"%d", messageid.length] forHTTPHeaderField:@"Content-Length"];
[deleterequest setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
NSString *postString = messageid;
[deleterequest setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
[connection start];
The server side code is below
@POST
@Consumes("text/plain")
@Path("/messagetodelete")
public void messageToDelete(String messageid){
//code to delete the message in MongoDB
System.out.println("R u here for iphone??");
}
Is the code in the client end (iPhone ) correct. The POST consumes a plain text. I believe this is where I am going wrong.
Could anyone please guide me as how to achieve it and make the NSMutableURLRequest accepted by the server?
There are these potential issues:
A "delete" request should use the DELETE method.
The definition of the header
[deleterequest setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
is wrong. A MIME type application/x-www-form-urlencoded
does not have a parameter, and no charset. A server will ignore this parameter.
The correct way to specify the header is:
[deleterequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
and use UTF-8 as the character encoding for parameter strings before applying the percent encoding.
When setting the Content-Length header you need to correctly evaluate the length of the body data in bytes. In your code you are setting the number of UTF-16 code units of the string. So, in order to fix that, you would need to do the following:
NSString* postString = ...;
NSString* postData = [postString dataUsingEncoding:NSUTF8StringEncoding];
[deleterequest setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[deleterequest setHTTPBody: postData];
You need to ensure that parameter strings have been properly encoded.