我有一个与服务器通信的应用程序。我需要向服务器发送消息ID。我正在使用NSMutableURL请求。但是,我在提交请求时收到405错误。
以下是代码
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];
服务器端代码在
之下@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??");
}
客户端(iPhone)中的代码是否正确。 POST使用纯文本。我相信这是我出错的地方。
有人可以指导我如何实现它并让服务器接受NSMutableURLRequest吗?
答案 0 :(得分:1)
如果在服务器端接受text / plain,则必须发送POST请求,内容类型为text / plain。此外,您缺少Content-type字符串中的分号。
尝试更改
[deleterequest setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
到
[deleterequest setValue:@"text/plain; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
编辑:您还需要在创建NSURLConnection之前移动设置请求参数的部分,因为请求是深层复制的,创建连接后请求的更改无效
答案 1 :(得分:1)
存在以下潜在问题:
“删除”请求应使用DELETE方法。
标题的定义
[deleterequest setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
错了。 MIME类型application/x-www-form-urlencoded
没有参数,也没有字符集。服务器将忽略此参数。
指定标题的正确方法是:
[deleterequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
并在应用百分比编码之前使用UTF-8作为参数字符串的字符编码。
设置Content-Length标头时,您需要正确评估正文数据的长度。在您的代码中,您要设置字符串的UTF-16代码单元数。因此,为了解决这个问题,您需要执行以下操作:
NSString* postString = ...;
NSString* postData = [postString dataUsingEncoding:NSUTF8StringEncoding];
[deleterequest setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[deleterequest setHTTPBody: postData];
您需要确保参数字符串已正确编码。