调用 WCF Web 服务时出现错误的 Json 响应

Posted

技术标签:

【中文标题】调用 WCF Web 服务时出现错误的 Json 响应【英文标题】:Wrong Json response on calling the WCF web service 【发布时间】:2013-05-29 13:36:18 【问题描述】:

大家好,我在处理 wcf json web 服务时遇到了一个奇怪的问题。从 android 调用相同的 web 服务时,它返回有效的 JSON,但是当我从 ios 调用时,我得到了 null只有null,我尽我所能尝试,但我没有弄错..我调用wcf Web服务的代码如下。

    NSString *urlStringRequest = [NSString stringWithFormat:@"%@%@",urlPath,parameterName]; //its my URL to connect to web server.

       NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStringRequest]];
       [request setHTTPMethod:@"POST"];
       [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

       NSError *error = nil;
       NSURLResponse *response = nil;
       NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

       NSArray *jsonArrayOne = [self parseJsonResult:result];

       NSLog(@"Json Resul: %@", jsonArrayOne);

函数parseJsonResult如下

     - (id)parseJsonResult:(NSData *)result
    
        if( ! result)
            return nil;
        NSError *error = nil;


        jsonArray = [NSJSONSerialization JSONObjectWithData: result options: NSJSONReadingMutableContainers error: &error];

        if (!jsonArray) 
            NSLog(@"Error parsing JSON: %@", error);
         else 
            for(NSDictionary *item in jsonArray) 
                NSLog(@"Item: %@", item);
            
        
        return jsonArray;

网址是这样的

http://xxx/xxx/xxx.svc/login?parameter=\"username\":\"abc.xyz\",\"password\":\"Password123\"

并从 android 调用这个 wcf web-service 返回正确的 json 响应,但从 iOS 调用返回 null 。我哪里弄错了,请帮帮我。

【问题讨论】:

您的服务器是否需要在请求中设置User-Agent 标头?请求完成后还要打印error,以检查是否有任何错误信息可用。 尝试记录你的 NSData *result NSLog 错误以防返回结果为 nil。这可能会提示有关该问题的信息。不要使用同步的便捷方法,使用异步方式的NSURLConnection,即实现委托方法。 @CouchDeveloper :感谢您的技巧使 ma 工作它抛出了错误的 url 错误,我用 stringByAddingPercentEscapesUsingEncoding 对 url 进行了编码,我得到了输出但又是错误的 json,从 android 它给出了输出 "LoginResult": "\"result\":\"success\":\"1\",\"data\":\"userid\":\"33\"" 其中是有效的 JSON,但对我来说,响应就像.. LoginResult = "\"result\":\"success\":\"1\",\"data\":\"userid\": \"33\""; 这不是有效的 JOSN。 【参考方案1】:

试试这个代码,当你得到正确的 JSOn 然后 c & p 你的 json 到 jsonformatter block 然后点击继续按钮

-(void)yourMethod

    NSString *urlStringRequest = [NSString stringWithFormat:@"%@%@",urlPath,parameterName]; //its my URL to connect to web server.

       NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStringRequest] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
       [request setHTTPMethod:@"POST"];

       NSString *stringBoundary = @"0xKhtmlbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo";
       NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];

       [request addValue:headerBoundary forHTTPHeaderField:@"Content-Type"];

       NSMutableData *postBody = [NSMutableData data];

      // media part
       [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

       [postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

       [request setHTTPBody:postBody];

       NSHTTPURLResponse* response =[[NSHTTPURLResponse alloc] init];
       NSError* error = [[NSError alloc] init] ;

      //synchronous filling of data from HTTP POST response
      NSData *responseData = [NSURLConnection sendSynchronousRequest:dataRqst returningResponse:&response error:&error];

       //convert data into string
       NSString *responseString = [[NSString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding:NSUTF8StringEncoding];

      NSLog(@"responseString %@ ",responseString);

    if (!error) 
        NSLog(@"Error parsing JSON: %@", error);
     else 
        if([[[[responseString objectForKey:@"LoginResult"] objectForKey:@"result"] objectForKey:@"success"] isEqualToString:@"1"];)
         
            jsonArray= [[[[responseString objectForKey:@"LoginResult"] objectForKey:@"result"] objectForKey:@"success"] objectForKey:@"data"];
             NSLog(@"jsonArray : %@",jsonArray);
         
    
    return jsonArray;

希望对你有帮助...!

【讨论】:

如果使用NSJSONSerialization,为什么需要包含SBJson文件? ;) 嗨 iShwar,看看我更新的代码。如果出现任何问题,请告诉我。谢谢 抱歉,我不明白尝试这段代码会有什么帮助。 @chandan:嗨,我没有收到错误 url 错误的 o/p 因为我通过使用 UTF-8 编码 url 解决了这个问题,但现在我得到了 o/p LoginResult = " \"结果\":\"成功\":\"1\",\"数据\":\"userid\":\"33\""; 这是错误的 JSON,从 android 调用的相同 Web 服务返回 "LoginResult": "\"result\":\"success\":\"1\",\"data\":\" userid\":\"33\"" 这是正确的o/p,而且,是的,我已经集成了您的代码而不是我的代码,所以我向您展示的输出是 NSLog(@"字典:%@",dictIs)。和 NSLog(@"dict : %@",jsonArray);给我null。 您好 iShwar,您的发送请求可能有误。所以根据更新的代码改一下

以上是关于调用 WCF Web 服务时出现错误的 Json 响应的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 XHR 联系 WCF 服务时出现 400 错误请求

在 mvc 中使用 WCF 服务时出现问题

在 C# 中调用 WCF 元数据时出现 *** 错误

从同一服务器上的 MVC 调用 WCF 服务时出现 SocketException

托管 WCF 时出现 500 服务器错误

在我的 Web 应用程序引用的类库中访问 wcf 数据服务时出现问题