1
<ServiceContract()> _
Public Interface IGetEmployees
 <OperationContract()> _
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json,BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="json/contactoptions/?strCustomerID={strCustomerID}")> _
Function GetAllContactsMethod(strCustomerID As String) As List(Of NContactNames)
End Interface

   <WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
Public Function GetAllContactsMethod(strCustomerID As String) As List(Of NContactNames) Implements IGetEmployees.GetAllContactsMethod
Utilities.log("Hit get all contacts at 56")
Dim intCustomerID As Integer = Convert.ToInt32(strCustomerID)
Dim lstContactNames As New List(Of NContactNames)
'I add some contacts to the list.
Utilities.log("returning the lst count of " & lstContactNames.Count)
Return lstContactNames
End Function

したがって、上記のコードを記述して、このhttp://xyz-dev.com/GetEmployees.svc/json/contactoptions/?strCustomerID=123のようにブラウザーで呼び出すと、JSON形式の結果として10行が取得されます。それは私が意図した通りです。しかし、Objective C側から呼び出すと、このような例外がスローされます

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'

私のObjectiveCコードは次のとおりです。

 NSString *strCustomerID = [NSString stringWithFormat:@"%i",123];
    jUrlString = [NSString stringWithFormat:@"%@?strCustomerID=%@",@"https://xyz-dev.com/GetEmployees.svc/json/contactoptions/",strCustomerID];
NSLog(@"the jurlstring is %@",jUrlString);
    NSURL *jurl = [NSURL URLWithString:jUrlString];
NSError *jError;
    NSData *jData = [NSData dataWithContentsOfURL:jurl];
    NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:jData options:kNilOptions error:&jError];
    NSLog(@"%@",json);
    NSLog(@"Done");

NSJSONSerialization行で例外が発生します。つまり、これは私の質問の続きのようなものです。ObjectiveCを介して呼び出されたときにWebサービスメソッドがヒットしませんでした。コードを少し変更したので、新しい質問を投稿しました。それは私がasp側でuritemplateを書いている正しい方法ですか?それは私がiOS側で呼んでいる正しい方法ですか?さらに情報が必要な場合はお知らせください。ありがとう..

4

1 に答える 1

1

URLが正しくないようです。それが正しいことを確認してください。

このサービスを設定するには、NSURLConnectionDelegateに従う必要があります。これは私がよく再利用するサンプルコードです。接続を設定してから、データを適切に処理する必要があります。デリゲートを作成し、完了またはエラーで通知します。

ドキュメント:http ://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

元。

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)


@implementation JSONService
@synthesize delegate;

- (void)start{
    dispatch_async(kBgQueue, ^{
        NSError *error = nil;
        NSURL *nsURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@?strCustomerID=%@",@"https://xyz-dev.com/GetEmployees.svc/json/contactoptions",strCustomerID]];
        NSData* data = [NSData dataWithContentsOfURL:nsURL options:NSDataReadingUncached error:&error];
        if (error) {
            NSLog(@"%@", [error localizedDescription]);
            [self notifyDelegateOfError:error];

        } else {
            NSLog(@"Data has loaded successfully.");
        }

        [self performSelectorOnMainThread:@selector(processData:) withObject:data waitUntilDone:YES];
    });
}
- (void)cancel{
    //TODO KILL THE SERVICE (GRACEFULLY!!!!!) -- ALLOW VC'S TO CANCEL THE SERVICE & PREVENT SEGFAULTS

}

- (id)initWithDelegate:(id<WebServiceDelegate>)aDelegate
{
    self = [super init];
    if (self) {
        [self setDelegate:aDelegate];
    }
    return self;
}

- (void)processData:(NSData *)data{

    //parse out the json data
    NSError* error;
    if(data == nil){
        error = [NSError errorWithDomain:@"NO_DOMAIN" code:001 userInfo:nil];
        [self notifyDelegateOfError:error];
        return;
    }
    //EITHER NSDictionary = json or NSMutableArray = json
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data
                                                    options:kNilOptions
                                                      error:&error];
    //NSArray *dataArray = [[json objectForKey:@"data"] objectForKey:@"current_condition"];
    //... more parsing done here.

    //NO ERRORS ALL DONE!
    [self notifyDelegateOfCompletion];

}

- (void)notifyDelegateOfError:(NSError *)error{
    [delegate webService:self didFailWithError: error];
}


- (void)notifyDelegateOfCompletion
{   
    if ([delegate respondsToSelector:@selector(webServiceDidComplete:)]) {
        [delegate webServiceDidComplete:self];
    }
}
于 2013-01-03T19:32:14.033 に答える