3

こんにちは 質問があります 自分で作ったWebサービスと連携するアプリを作りたいです

私のアプリには、app_id と token という 2 つの uniqueID があります。app_id は、アプリの最初の起動時に 1 回だけ生成され、トークンは Web サービスによって生成されます。

リクエストごとに、トークンの有効期限が切れているかどうかを確認する必要があります。トークンの有効期限が切れている場合は、別の Web サービスを呼び出して新しいトークンを生成します

問題は、アプリが 2 つの異なる Web サービスにアクセスする必要があることです。新しいトークンを要求し、別の必要なデータを取得するためです。

私はasynctaskを使用していますが、リクエストトークンに対するWebサービスからの応答は常にすべてのリクエストと同じであり、理由がわかりません

protected Boolean doInBackground(Void... params) {
        int status = 0;
        int token_expired=0;
        String token_val = token.getToken(getBaseContext());
        for(int i=0;i<5 && status==0;i++) {
            try {
                Thread.sleep(1000);
                //function to check if token already expired or not and request new token using http post
                token_expired = token.checkToken(getBaseContext());
                System.out.println("token expired: " +token_expired);
                if (token_expired==1 || token_expired==2) {
                     //function to call another web service and get a data from it
                     status =  rclient.Execute("POST");
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (status==0) {
            return false;
        }else{
            return true;
        }
    }

前にありがとう!

4

3 に答える 3

0

あなたが投稿したコードによると、データを取得するために rclient.Execute("POST") が使用されていると思います。しかし、以下のコード

if (token_expired==1 || token_expired==2) {
     //function to call another web service and get a data from it
     status =  rclient.Execute("POST");
}

トークンがまだ生きている場合は、新しいトークンを再度取得しようとしていることを示しています。行 status = rclient.Execute("POST"); だと思います サーバーからデータをフェッチするコードに置き換える必要があります。

于 2013-04-12T07:39:19.617 に答える
0

関数に残りのクライアントクラスのコンストラクターを配置した後、問題は解決しました

于 2013-04-12T08:36:45.830 に答える
0

そうそう、これはクラス トークン ハンドラからのチェック トークンの関数です。

public Integer checkToken(Context context) {
        int status = 0; //0 = failed to request token , 1 = successfully request new token, 2 = token has not expired yet
        String token_id = getToken(context); 
        System.out.println("token_id: " +token_id);
        //if (token_id!=null) {
            Long time = getTime(context);
            Long curr_time = System.currentTimeMillis()/1000;
            System.out.println("time before: " +time);
            System.out.println("time current: " +curr_time);
            Long interval = curr_time - time;
            System.out.println("interval: " +interval);
            if (interval>10) {
                status = TokenGenerator(context);
            }else {
                status = 2;
            }       
        //}
        return status;      
    }

}

これは、同じクラスから新しいトークンを要求する関数です

    public synchronized Integer TokenGenerator(Context context) {
     int status = 0;
     SharedPreferences sharedPrefs = context.getSharedPreferences(TOKEN_STORAGE, Context.MODE_PRIVATE);
     uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
     try {
        rclient.AddJSON("app_id", uniqueID);
        rclient.CompileJSON();
    } catch (JSONException e1) {
        e1.printStackTrace();
    }
     try {
        status =  rclient.Execute("POST");
     } catch (Exception e) {
         e.printStackTrace();
     } 
     if (status==1) {
        String response = rclient.getResponse();
        String token = null;
        System.out.println("uuid_response: " +response);
        try {
            JSONObject json = new JSONObject(response);
            token = json.getString("result");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Long tsLong = System.currentTimeMillis()/1000;
        String ts = tsLong.toString();
        System.out.println("time: " +ts);
        Editor editor = sharedPrefs.edit();
        editor.putString(TIMESTAMP, ts);
        editor.putString(TOKEN_ID, token);
        editor.commit();
        }
return status;

}

したがって、基本的に残りのクライアント クラスは 2 回呼び出されます。1 回目はクラス トークン ハンドラで新しいトークンを要求し、2 回目はアクティビティ自体から呼び出されます。

于 2013-04-12T07:28:58.797 に答える