无法使用 AFNetworking 将 iOS 连接到 asp.net webservices

Posted

技术标签:

【中文标题】无法使用 AFNetworking 将 iOS 连接到 asp.net webservices【英文标题】:Cannot connect iOS using AFNetworking to asp.net webservices 【发布时间】:2013-05-21 15:51:01 【问题描述】:

我正在尝试从 ios 连接到 asp.net webservices,但我收到错误 500。如果使用 jQuery.ajax 从 Web 连接而不是从 iOS 连接,则 webservices 正在工作。是否必须在服务器端设置任何设置才能允许连接?可能是一些不允许外部连接的安全设置?我如何确保网络服务返回 json。当我尝试将 url 直接输入浏览器时,我得到了 webservices 目录,我可以调用 webservice,但出现错误。不过,一切都在网站上完美运行。这是我在 iOS 端使用的代码

- (void)viewDidLoad

    [super viewDidLoad];
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: [NSDictionary dictionaryWithObjectsAndKeys:@"user", @"userName",@"test", @"password",nil],@"request",nil];
    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:
    [NSURL URLWithString:@"http://www.server.com"]];
    //[client setDefaultHeader:@"contentType" value:@"application/json; charset=utf-8"];
    client.parameterEncoding = AFJSONParameterEncoding;
    NSMutableURLRequest *request =
    [client requestWithMethod:@"POST" path:@"/mobile/user.asmx/login" parameters:params];
    NSLog(@"request %@",request);
    AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                            success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
    
          NSLog(@"response %@",response);
          NSLog(@"JSON: %@", [JSON valueForKeyPath:@"LoginResult"]);
          NSLog(@"Code: %@", [[[JSON valueForKeyPath:@"LoginResult"] valueForKeyPath:@"Code"] stringValue]);
          NSLog(@"FaultString: %@", [[JSON valueForKeyPath:@"LoginResult"] valueForKeyPath:@"FaultString"]);
             
             failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
             
                 NSLog(@"error opening connection %d %@",response.statusCode, error);
                 NSLog(@"request %@",request);
             ];
[operation start];

这是在网站上运行的代码

$('#signin').click(function (e) 
            e.preventDefault();
            var user = $('#user').val();
            var password = $('#password').val();
            var holdval = "<ul>";
            if (user == null || user == "")
                holdval += "<li>Provide user name</li>";

            if (password == null || password == "")
                holdval += "<li>Provide password</li>";

            holdval += "</ul>";
            if (holdval != "<ul></ul>") 
                $('#msg').show();
                $('#msg').html(holdval);
                return;
            

            var temp = new User(user, password);
            $("#loader").show();
            var jsontxt = JSON.stringify( user: temp );
            jQuery.ajax(
                type: "POST",
                url: "/mobile/user.asmx/login", //http://www.server.com

                contentType: "application/json; charset=utf-8", 
                data: jsontxt,
                dataType: "json",
                success: OnSuccess,
                error: OnError
            );
        );

更新

正如 Cory 建议的那样,我使用了 wireshark 并检查了 http 流量。原来该请求是一个 GET 请求,但我仍然无法使其正常工作。问题是网站请求使用用户名传递 json 数据,而 afnetworking 仅传递用户名和密码

这是来自网站 http://www.server.com/user.asmx/loginuser%22user%22:%22username%22,%22password%22:%22pass%22

这是来自 iOS http://www.server.com/user.asmx/loginuser?password=pass&user=username

在我看来参数没有变成json

这是我在 iOS 上使用的更新代码

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.server.com/user.asmx/"]];
    [httpClient setParameterEncoding:AFJSONParameterEncoding];
    [httpClient setDefaultHeader:@"contentType" value:@"application/json; charset=utf-8"];
[httpClient getPath:@"loginuser" parameters:@@"user":@"username",@"password":@"pass" success:^(AFHTTPRequestOperation *operation, id responseObject) 
        NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

任何建议将不胜感激!

更新 2 使用 afsjonrequestoperation 在上面的第一个代码中添加此代码后

[client setAuthorizationHeaderWithUsername:USERNAME password:USER_PASSWORD]; //setting authorization header
[client requestWithMethod:@"POST" path:@"login/" parameters:nil]; //parameter nil
 [request setHTTPMethod:@"GET"];

在我开始操作后我没有收到任何错误或响应,但如果我检查 wireshark,我会收到 401 Unauthorized 和 html 说凭据无效。我确定用户名和密码是正确的。我不确定这是否比我以前更进一步。请让我知道你在想什么。再次感谢!

【问题讨论】:

您可以使用像 Charles Proxy 这样的代理来检查来自 ajax 和 iOS 请求的原始 HTTP 请求以找出差异。 感谢您的回复。我更新了问题。 需要将json编码的参数放入请求体中。 您能否详细说明如何做到这一点。谢谢。 【参考方案1】:

GET 请求将序列化查询字符串中的参数,因为根据RFC 2616,GET 请求不应包含实体主体。

对于您的特定情况,您可以使用上面的代码(如以前一样创建POST 请求)使其工作,但在之后立即添加以下行:

[request setHTTPMethod:@"GET"];

【讨论】:

感谢您的回复。您是在谈论第一个代码示例吗?我在[操作开始]之前添加了您建议的行,对吗?我仍然收到相同的错误错误打开连接 500 错误域 = AFNetworkingErrorDomain 代码 = -1011 “(200-299)中的预期状态代码,得到 500” UserInfo = 0x8cab0a0 NSLocalizedRecoverySuggestion = “消息”:“处理错误请求。","StackTrace":"","ExceptionType":"",我认为请求仍然有问题。 我说错了。那应该是GET。 500 错误意味着问题出在服务器上。 在进行您建议的更改后,我收到错误打开连接 0 Error Domain=kCFErrorDomainCFNetwork Code=303 “操作无法完成。(kCFErrorDomainCFNetwork 错误 303。)”我确定没有连接问题。你能看到它还能是什么。有没有办法检查实际发送到服务器的内容。我正在使用wireshark,但我只能看到没有用户名和密码参数的链接你认为这可能是服务器上的一些设置吗?该网站的工作没有问题。谢谢一百万! 此时,由您来调试您的服务器,因为这似乎是问题所在。 AFHTTPRequestOperationLogger 应该对此有所帮助。 再次感谢您的帮助。我将与构建 Web 服务的人合作,看看我们是否可以在服务器端查明问题。

以上是关于无法使用 AFNetworking 将 iOS 连接到 asp.net webservices的主要内容,如果未能解决你的问题,请参考以下文章

IOS/AFNetworking:将两个 JSON 操作排入队列,然后比较返回的 NSArrays

AFNetworking 请求失败问题

AFNetworking 可达性 iOS

使用 AFNetworking、ios 上传图片

无法在 ios 中使用 afnetworking 发布 JSON

如何与 Heroku 和 iOS 一起做 AFNetworking?