【问题标题】:NSMutableURLRequest transform to ASIFormDataRequestNSMutableURLRequest 转换为 ASIFormDataRequest
【发布时间】:2012-05-06 04:33:04
【问题描述】:

我已经写好了交友代码:

NSString *urlString = [NSString stringWithFormat:ADDRESS,action];
postStr = @"user_name=Thomas Tan&phone=01234567891&password=123456";
NSData *myRequestData = [NSData dataWithBytes:[postStr UTF8String] length:[postStr length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody: myRequestData];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",responseString);

效果很好,但是现在我想使用asihttprequest框架,所以如何更改上面的代码,我已经编写了代码,但是它无法得到正确的结果,只是得到服务器错误信息。所以是什么有问题吗?

NSString *urlString = [NSString stringWithFormat:ADDRESS,action];

NSURL *url = [NSURL URLWithString:urlString];
ASIFormDataRequest *requeset = [ASIFormDataRequest requestWithURL:url];
[requeset setRequestMethod:@"POST"];
[requeset setPostValue:@"Thomas Tan" forKey:@"user_name"];
[requeset setPostValue:@"01234567891" forKey:@"phone"];
[requeset setPostValue:@"123456" forKey:@"password"];
[requeset startSynchronous];
NSError *error = [requeset error];
if (!error) {
    NSString *re = [requeset responseString];
    NSLog(@"%@",re);
}
NSLog(@"%@",error);

提前谢谢你。

更新:

NSString *urlString = [NSString stringWithFormat:ADDRESS,action];
NSURL *url = [NSURL URLWithString:urlString];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"POST"]; 
[request appendPostData:[@"user_name=Thomas Tan&phone=01234567891&password=123456" dataUsingEncoding:NSUTF8StringEncoding]];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
    NSString *re = [request responseString];
    NSLog(@"%@",re);
}
NSLog(@"%@",error);

我用上面的代码,也不能得到同样的结果,而且error不是nil。

【问题讨论】:

  • “不能得到正确的结果”是什么意思?您看到的错误是什么?
  • 它只是获取服务器错误信息,我想要的是与第一个代码得到相同的结果。
  • 代码对我来说是正确的;如果error 不为零,它实际打印了什么?
  • 是的,error为nil,所以可以打印“re”,但问题是为什么我使用这段代码可以得到不同的返回值?我认为它们是相同的......

标签: ios asihttprequest nsmutableurlrequest asiformdatarequest


【解决方案1】:

您的 ASIHTTP 代码与您的 NSURLConnection 代码做的事情不同。 ASIFormDataRequest 会自动:

这通常正是您想要的,但是如果您的 NSURLConnection 代码的行为正确,而 ASIHTTP 的行为不正确,那么您需要更改为 custom ASIHTTP POST 并使用 ASIHTTPRequest,而不是 ASIHTTPFormDataRequest,然后手动设置内容回application/x-www-form-urlencoded:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"POST"]; 
[request addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded"];
[request appendPostData:[@"user_name=Thomas Tan&phone=01234567891&password=123456" dataUsingEncoding:NSUTF8StringEncoding]];

这样做,并检查使用Wireshark 发送到服务器的确切内容,我可以看到发送的 POST 数据仍然不太相同(左侧为 ASIHTTP,右侧为 NSURLConnection):

但内容类型、长度和实际数据是相同的。 此时,我希望您的服务器返回相同的结果。 如果仍然不匹配,您可以编辑 ASIhTTP 请求参数以匹配。

【讨论】:

  • 完全按照我上面的方法试试;如果这仍然不起作用,需要查看服务器正在获取的确切内容 - 您是否有权访问服务器日志? (实际上告诉我您的客户返回的内容也将有所帮助)
  • Tan - 抱歉,它没有工作,它缺少一个关键行,现在已修复。我比较了两者的输出并显示差异,现在非常接近,应该匹配。
  • 非常感谢,当我添加行时[request addRequestHeader:@"Accept" value:@"/"];我可以得到相同的数据,我不'不知道为什么,我不知道“接受/”是什么意思。
  • 简单地告诉服务器你想要什么样的响应 - Accept: */* 的意思是,“响应任何你喜欢的方式”。见w3.org/Protocols/rfc2616/rfc2616-sec14.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多