4

私はWebサービスについて多くの読書と調査を行い、iOSアプリ側からそれらを消費しました。しかし、多くの Web サイトは非常に簡潔であり、データの使用と解析について詳しく説明していません。現在、私は raywenderlich によるチュートリアルhttp://www.raywenderlich.com/2965/how-to-write-an-ios-app-that-uses-a-web-serviceを読んでおり、SO スレッドを読んでいます http://stackoverflow.com/questions/7364326/recommendations-for-net-web-service-format-protocol-for-android-iphone-etc-iが、どのようにアプローチすべきかはまだ不明です。

私がこれまでに知っていることから、Web サービスを使用するいくつかの方法は REST および SOAP プロトコルです。(Xcode でアプリを作成し、VB (.asmx ファイル) で Web サービスを実行します)

私は、記事などを読むよりも、チュートリアルで実践することで、より多くのことをより速く学ぶタイプの男です。php ではなく .asmx (VS で構築された Web サービス) を使用するチュートリアルはありますか。個人的には、JSON を解析する REST プロトコルの方が使いやすいと多くの人が言っており、Apple はすでにそのための lib/framework を持っていると言っています。

iOS アプリが Web サービスを利用できるようにする方法を学ぶことは、将来のアプリ開発において非常に重要であると感じているので、誰かが私を正しい方向に向けることができれば素晴らしいことです。

編集: php webservice を読んだ後、私が持っていないものがいくつかあります。

関数から償還するhttp://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app

// Put parameters into local variables
        $rw_app_id = $_POST["rw_app_id"];
        $code = $_POST["code"];
        $device_id = $_POST["device_id"]

asmx ファイルを使用している場合、すべての Web メソッドでこのようなものを宣言する必要がありますか?

私の webMethod (基本的な CRUD) の EG

【ウェブメソッド】

        public string insertUser(string User, string Password, string Gender)
        {

               try
                {

                    string connectionString = ConfigurationManager.ConnectionStrings["mysql"].ToString();
                    MySqlCommand dCmd = new MySqlCommand();
                    using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
                    {

                        if (do_check_record(User) == false)
                            {

                                mysqlCon.Open();
                                dCmd.CommandText = "INSERT into tbl_login (username,password,gender) values (?username,?password,?gender)";
                                dCmd.CommandType = CommandType.Text;
                                dCmd.Parameters.Add(new MySqlParameter("?username", User));
                                dCmd.Parameters.Add(new MySqlParameter("?password", Password));
                                dCmd.Parameters.Add(new MySqlParameter("?gender", Gender));
                                dCmd.Connection = mysqlCon;
                                dCmd.ExecuteNonQuery();
                                mysqlCon.Close();

                            }
                            else

                            {
                                return string.Format( "User exists in data_base");
                            }

                    }

                    return string.Format("data_base insert");

                }
                catch (Exception ex)
                {
                    return string.Format(ex.Message);
                }

}

アプリ側からの Web サービスの使用中

チュートリアルで与えられた例は

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"Want to redeem: %@", textField.text);

    // Get device unique ID
    UIDevice *device = [UIDevice currentDevice];
    NSString *uniqueIdentifier = [device uniqueIdentifier];

    // Start request
    NSString *code = textField.text;
    NSURL *url = [NSURL URLWithString:@"http://www.wildfables.com/promos/"];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:@"1" forKey:@"rw_app_id"];
    [request setPostValue:code forKey:@"code"];
    [request setPostValue:uniqueIdentifier forKey:@"device_id"];
    [request setDelegate:self];
    [request startAsynchronous];

    // Hide keyword
    [textField resignFirstResponder];

    // Clear text field
    textView.text = @"";    

    return TRUE;
}

しかし、IBAction代わりに呼び出すボタンであってはなりませんBOOLか?

- (void)requestFinished:(ASIHTTPRequest *)request
{    

    if (request.responseStatusCode == 400) {
        textView.text = @"Invalid code";        
    } else if (request.responseStatusCode == 403) {
        textView.text = @"Code already used";
    } else if (request.responseStatusCode == 200) {
        NSString *responseString = [request responseString];
        NSDictionary *responseDict = [responseString JSONValue];
        NSString *unlockCode = [responseDict objectForKey:@"unlock_code"];

        if ([unlockCode compare:@"com.razeware.test.unlock.cake"] == NSOrderedSame) {
            textView.text = @"The cake is a lie!";
        } else {        
            textView.text = [NSString stringWithFormat:@"Received unexpected unlock code: %@", unlockCode];
        }

    } else {
        textView.text = @"Unexpected error";
    }

}

- (void)requestFailed:(ASIHTTPRequest *)request
{    
    NSError *error = [request error];
    textView.text = error.localizedDescription;
}

間違っていたら訂正してください。ただし- (void)requestFinished:(ASIHTTPRequest *)request、チュートリアルで使用されているこのメソッドは、JSON を解析しているものですよね? もしそうなら、私が呼び出すすべての webmethod に対して、新しいリクエストと新しい- (void)requestFinished:(ASIHTTPRequest *)request

編集:どんな助けでも本当に感謝しています...私はこれの初心者であり、経験のある人が私を案内してくれることを願っています.

4

2 に答える 2

2

また、すべての Web メソッドでこのようなものを宣言する必要がありますか?

上記のコードは、POST からデータを抽出しています。asmx ファイルはすでにこれを行っているはずです。POST で渡すパラメーターは、MethodName に渡されるパラメーターに変換されます (参照: XML Web サービスへのアクセス)。


アップデート

したがって、これを正しく理解している場合、Web サービスのエンドポイントはhttp://xxx.yyy/zzz.asmx/insertUserです。次に、変数のユーザー名、パスワード、および性別を使用して投稿本文を送信します。

[request setPostValue:username forKey:@"User"];
[request setPostValue:password forKey:@"Password"];
[request setPostValue:gender forKey:@"Gender"];

しかし、BOOL の代わりに IBAction ボタンを呼び出すべきではありませんか?

No.-textFieldShouldReturn:UITextFieldのデリゲートメソッドです。IBAction ではありません。

ユーザーがテキスト フィールドに触れると、キーボードがアクティブになります。キーボードの戻るボタンが押されると、テキスト フィールドのデリゲートに-textFieldShouldReturn:メッセージが送信されます。

つまり、キーボードで return または done が押されたときに、このメソッドが呼び出されます。


見逃していた部分の情報を追加しました

間違っていたら訂正してください。ただし-requestFinished:、チュートリアルで使用されているこのメソッドは、JSON を解析しているものですよね? もしそうなら、私が呼び出すすべての webmethod に対して、新しいリクエストと新しい-requestFinished:

いいえ、-requestFinished:クラスごとに 1 つだけです。クライアントを複数のクラス (Web サービス URL ごとに 1 つ) に分割するか、1 つの .xml で異なる URL を区別する必要があります-requestFinished:

- (void)requestFinished:(ASIHTTPRequest *)request
{
    if ([request.originalURL.absoluteString isEqualToString:@"http://xxx.yyy/zzz.asmx/methodName"]) {
        // handle methodName endpoint.
    }
}

デリゲートの動作が気に入らない場合は、の代わりに-setCompletionBlock:andを使用することもできます。さらに良いことに、@Stew が提案したような AFNetworking のようなものを選択してください。-setFailedBlock:-setDelegate:

于 2012-07-16T03:28:20.800 に答える
1

AFNetworking ライブラリ ( https://github.com/AFNetworking/AFNetworking ) を使用し、組み込みの AFJSONRequestOperation を使用することをお勧めします: https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFJSONRequestOperation.h

「リクエスト終了」コールバックを実装するのではなく、リクエストが完了したときに成功ブロックを呼び出し、JSON オブジェクトを引数として渡します。そのオブジェクトは、成功ブロックで必要なものに解析できます。

この回答に使用方法の例がありますhttps://stackoverflow.com/a/8920596/223558

于 2012-07-16T03:28:11.340 に答える