POST NSMutableURLRequest中出现405错误

时间:2013-11-24 08:08:03

标签: ios macos http-post nsurlconnection nsmutableurlrequest

我有一个与服务器通信的应用程序。我需要向服务器发送消息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吗?

2 个答案:

答案 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];
    
  • 您需要确保参数字符串已正确编码。