-1

私はIOS開発にかなり慣れていないので、ネイティブメソッドを使用してデータをサービスに投稿する必要があります。

私はこのようなことをする必要があると思いますか?

NSString *content = @"field1=42&field2=Hello";

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.mywebsite.co.uk/SendEmail.svc/request"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[content dataUsingEncoding:NSISOLatin1StringEncoding]];

// generates an autoreleased NSURLConnection
[NSURLConnection connectionWithRequest:request delegate:self];

よくわからないので、私はこれについて正しいことをしていますか?URLを手動で作成するか、jsonをfiddlerに投稿することで、サービスに正常に投稿できます。

4

3 に答える 3

6

あなたはこのようにそれを行うことができます:

  • WCFサービスで次のようなWebサービスメソッドを作成します(インターフェイスのようなまたは具体的なサービスの実装)。

    [OperationContract]
    [WebInvoke(UriTemplate = "GetJourneys", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    JourneyListResult GetJourneys(string sessionID);
    

Request / Reponseオブジェクトは、任意のDataContractオブジェクトにすることができます(.NETを介してシリアル化されますDataContractJsonSerializer

  • リクエストで使用するペイロードディクショナリを作成します。

    NSDictionary *payloadDict = [NSDictionary dictionaryWithObjectsAndKeys:self.sessionID,@"sessionID", nil];
    NSString *operationName = "GetJourneys";
    
  • 次のようなリクエストを作成します。

    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
    urlRequest.URL = [NSURL URLWithString:[@"http://url/of/your/Service.svc/" stringByAppendingString:operationName];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest addValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-type"];
    
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payloadDict options:0 error:NULL];
    [urlRequest setHTTPBody:jsonData];
    
    ITLog(@"Issuing request: %@ %@", self.operationName, [self payloadDict]);
    
  • リクエストを送信します(backgroundQueueは以前に作成されたNSOperationQueueです。UI処理のために必ずメインキュー(/スレッド)にディスパッチしてください):

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:backgroundQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
            if (!error && data.length > 0) {
                NSError *jsonError = nil;
                id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError];
                if (!jsonError && [jsonObj isKindOfClass:[NSDictionary class]]) {
                    // process result here
                } else {
                    // error handling
                }
            } else {
                // error handling
            }
        }];
    
  • 結果をデコード/使用する

    if ([jsonObject isKindOfClass:[NSArray class]]) {
        NSArray *dictarr=(NSArray*)jsonObject;
        NSMutableArray *resultarr=[[NSMutableArray alloc] init];
        for (NSDictionary *dict in dictarr) {
            ITJourney *journey =[[ITJourney alloc]initWithDictionary:dict];
            [resultarr addObject:journey];
        }
        // use resultarr from here...
    }
    

私が大学のために作成した小さなサンプルプロジェクトにまとめられているのをここで見ることができます:

アプリリンクWCFサービスリンク
画像をアップロードするためのセッション処理とバイナリストリームもあります(非常に基本的)

于 2013-03-05T21:41:37.897 に答える
1

その投稿をしてくれたMartinに感謝します、それは非常に役に立ちました。接続するのに問題があり、何度も調べた後、私のsvcがjsoncontent-typeを受け入れていないことがわかりました。私の修正は、Factory = "System.ServiceModel.Activation.WebServiceHostFactory"属性を.SVCファイルに追加することでした。つまり、次のようになります。

<%@ ServiceHost Language="C#" Debug="true" Service="YourService" CodeBehind="YourService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

これが誰かを助けることを願っています...

于 2013-11-25T14:10:39.237 に答える
-3

ネイティブメソッドの意味はわかりませんが、これをたくさん行う場合、特にリクエストをキューに入れる予定がある場合は、AFNetworkingなどのサードパーティライブラリを調べることをお勧めします。

とはいえ、サービスに正常に投稿できる場合、質問は何ですか?

于 2013-03-05T20:39:51.023 に答える