2013-12-17 6 views
-1

wcf 메서드를 작동 시키려고 할 때 오류가 있습니다. 매개 변수 중 하나는 NSMutableArray이고 Object 유형은 TypeClass입니다. NSMutableArray로 모든 것을 검사했는데 모든 것이 잘된 것처럼 보입니다. 매개 변수에 대한objective-C의 객체를 비 직렬화하는 방법

내 코드는 다음과 같습니다 WCF에서

NSData *myPostData = [[NSString stringWithFormat:@"{\"parameter1\":\"%@\"}",mynsmutablearraylist] dataUsingEncoding:NSUTF8StringEncoding]; 
NSMutableData *myMutablePostData = [NSMutableData dataWithData:myPostData]; 

매개 변수 유형은 목록 < TypeClass처럼>.

mynsmutablearraylist의 개체와 키 값을 볼 수 있습니다. 하지만 왜 작동하지 않는지 나는 이해할 수 없다.

이 wcf 메서드는 Win8 Metro 응용 프로그램에서 작동하지만 IOS에서는 작동하지 않습니다.

서버가 요청을 처리하는 중 오류가 발생했습니다. 예외 메시지는 ' 메시지를 비 직렬화하는 동안 포맷터가 예외를 throw했습니다. 매개 변수를 역 직렬화하려고 시도하는 동안 오류가 발생했습니다. http://tempuri.org/:typeclass. 의 InnerException 메시지 유형의 객체 System.Collections.Generic.List`1 [[ServiceOfMine.Entities.TypeClass, ServiceOfMine, 버전 = 1.0.0.0를 역 직렬화 오류가 발생했습니다 '입니다, 문화 = 중립, PublicKeyToken = 없는]]. 잘못된 문자 ' '이 (가) 발생했습니다. '. 자세한 내용은 InnerException을 참조하십시오. '. 자세한 내용은 서버 로그 을 참조하십시오. 예외 스택 추적은 다음과 같습니다

추가 정보 : 나는 정확히 같은 값으로 매개 변수를 테스트 할 때 잘 작동

. SOAPUI에서 요청의 일부 : 원래 질문의 @"{\"parameter1\":\"%@\"}" 형식 문자열에 기초

> >.... 
> >  <tem: parameter4>parvalue</tem: parameter4> 
> >  < tem: typeclass> 
> >   <!--Zero or more repetitions:--> 
> >   <ser:TypeClass> 
> >    
> >   <ser:drugId></ser:drugId> 
> >   <ser:drugname></ser:drugname> 
> >   </ser:TypeClass> 
> >   <ser:TypeClass> 
> >    
> >   <ser:drugId></ser:drugId> 
> >   <ser:drugname></ser:drugname> 
> >   </ser:TypeClass> 
> >  </ tem: typeclass> 
> >  ... 
+0

예상되는 데이터의 형식과 실제로 보낸 내용을 알고 있습니까? – Wain

+0

NSString 형식의 단어를 반환합니다. 예, 나는 그것들을 안다. 나는 그들을 디버그로 많이 점검했다. – user3065761

+1

@ user3065761 : 그는 데이터의 * 유형 *을 말하지 않았으며 * 형식 *이라고 말했습니다. '[NSString stringWithFormat : @ "% @", someNSMutableArray]'를 실행하면 WCF가 기대하는 형식이 아닌 기본 NSArray 문자열 형식을 사용하게됩니다. 예를 들어, NSArray는'(apple, banana, "organic lemon")과 같은 문자열을 줄 수 있지만 WCF는'[ "apple", "banana", "organic lemon"과 같은 배열을 기대합니다. '. (실제로 WCF가 원하는 것을 알지는 못하지만 확실하게 여러 가지 방법으로 목록을 형식화 할 수 있음을 알 수 있습니다.) – Chuck

답변

2

, 나는 당신이 JSON 요청을 구축을 위해 노력하고 생각했습니다. 하지만 아마 JSON 요청을 생성하는 가장 좋은 방법은 아니기 때문에 아래의 원래 답변은 JSON 요청을 올바르게 작성하는 방법에 중점을 두었습니다.

그러나 일반적인 웹 서비스 인터페이스의 적어도 세 가지 종류가 있습니다, 다시 단계 :

  • 내가 (아마도 잘못) 따라서, 당신은 당신의 원래 질문의 기초 원 추정 JSON을, 내 원판 답변, 아래;

  • 수정 된 질문에서 SOAP 요청을 원할 수도 있음을 제안합니다. 또는

  • 일부 표준 HTTP 요청 (예 : application/x-www-form-urlencoded 또는 다른 일반적인 변형). 에 관계없이 당신이 NSMutableArray 매개 변수에 대한 %@를 사용하여, stringWithFormat를 사용하려고 노력하는 이들의 어떤의

은 의심 할 여지없이 올바르지 않습니다.

그래서 질문에 정확히 어떤 형식이 필요한지 궁금합니다.수정 된 질문에서 알 수 있듯이 SOAP 요청을 작성해야하는 경우 수동으로 XML 태그를 추가하거나 XML 태그를 직접 추가하거나 라이브러리를 사용해야합니다. Mac OS X에서이 작업을 수행하는 경우 Web Services Core Programming Guide을 참조하십시오. iOS에서 일하는 경우 제 3 자 라이브러리를 찾아야합니다. 아마도이 스택 오버플로 질문은 좋은 시작 장소입니다 : How to access SOAP services from iPhone. 또는 "[ios] soap request"에 대한 스택 오버플로를 검색하면 많은 다른 히트를 얻을 수 있습니다.

개인적으로 iOS 앱에서 SOAP 서비스를 테스트 할 때 수동으로 요청을 작성했지만 어색하고 어색합니다. 웹 서비스에서 JSON 인터페이스를 제공하는 경우 iOS 지원 기능이 훨씬 뛰어나므로 바람직 할 수 있습니다.

어쨌든 JSON 요청에 대한 POST 본문을 작성하는 방법을 보여주는 내 원래 답변은 아래와 같습니다.


원래 답 :

우리가 요청의 전체 형식에 대한 자세한 내용은없이 더 구체적으로 얻을 것은 불가능하지만, 그냥 JSON 요청을 만들려고하는 경우, 당신은 만들 것 그 NSDataNSJSONSerialization을 사용하여, 아니 stringWithFormat 예 아마 그런 짓을 :

NSDictionary *dictionary = @{@"parameter1": mynsmutablearraylist, 
          @"parameter2": someOtherObject}; 
NSError *error = nil; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 
NSAssert(postData, @"%s: dataWithJSONObject error: %@", __FUNCTION__, error); 

당신은 또한 "개체와 mynsmutablearraylist의 키"를 참조하지만, 내가 제안하는 (이름으로 혼란 스러워요 자사의 NSMutableArray 및 참조에 "객체와 키 "). 하지만 배열 사전이라고 가정합니다.이 경우 위의 구문이 여전히 작동합니다. 그러나 다시 한번, 귀하의 서비스가 무엇을 원하는지 정확하게 모른 채 말하기는 어렵습니다.

NSMutableData 렌 디션을 만드는 이유가 이해가되지 않지만이 JSON에 매개 변수를 더 추가하려는 경우 원래의 사전에 먼저 추가해야하며 NSJSONSerialization을 사용해야합니다. JSON 형식으로 원하는 사전/배열 구조를 완벽하게 구축했습니다. 예 :

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
[dictionary setObject:mynsmutablearraylist forKey:@"parameter1"]; 
[dictionary setObject:someOtherObject  forKey:@"parameter2"]; 
// ... repeat for all of the objects in the dictionary 

NSError *error = nil; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 
NSAssert(postData, @"%s: dataWithJSONObject error: %@", __FUNCTION__, error); 
+0

그래서 NSMutableArray NSString으로 변환하려고하는 문제가 될 수 있습니까? – user3065761

+0

@ user3065761 예, NSMutableArray와 함께'stringWithFormat'을 사용하면 확실히 작동하지 않습니다. 초기 질문에서 JSON 요청을 제안했으나 사용자의 개정판에서 SOAP 인터페이스를 제안 했으므로 지금 내가 필요한 부분을 정확히 모르고 있다고 고백해야합니다.어쨌든, 나는이 점들 중 일부를 확장하기 위해 나의 답을 수정했다. – Rob

+0

다른 코딩 문제로 인해 오랜 시간이 걸렸지 만 제대로 만들었습니다. 고맙습니다. @ 롭. dataWithJSONObject에 대해 NSMutableDictionary를 만들었습니다. 그리고 NSMictionary 내에서 NSDictionary와 NSMutableDictionary를 사용했습니다. – user3065761