質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.57%

djangoのGetメソッドについて。Getリクエスト受け取り毎に更新後情報が欲しいのに、更新前?の情報が返ってくる。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 845

bakara1332

score 13

掲示板?のようなものをを作りたいと思っています。
そこで、まずはシンプルなものからと思い、以下の機能を開発しようとしています。

①android stdioのedit text等に項目を入力後コメント投稿用のボタンでdjangoのデータベースに保存する。
②コメント一覧表示用のボタンでデータベースに入っている情報を取得し表示させる。

①の処理は問題なくできたのですが、いくらPOSTメソッドで情報を追加して②の処理をしても初め?に取得した情報と同じ情報が返ってきます。

汚く無駄の多いコードで申し訳ないですがよろしくお願いします。

//対応するボタンを押したらGetTaskクラス呼び出し
  GetTask getTask = new GetTask(){
        @Override
        protected void onPostExecute(String result) {

            //クリア
            PublicJsonArray.body.clear();
            PublicJsonArray.level.clear();
            PublicJsonArray.title.clear();
            PublicJsonArray.name.clear();
            PublicJsonArray.facility_id.clear();

            JSONObject jsonObject;
            System.out.print("ViewCommentActivity" + PublicJsonArray.jsonArray);
            for(int i = 0; i < PublicJsonArray.jsonArray.length(); i++){
                try {
                    //データベースから取得した値を属性ごとに各配列に格納
                    jsonObject = (JSONObject) PublicJsonArray.jsonArray.get(i);
                    PublicJsonArray.facility_id.add(jsonObject.getInt("facility_id"));
                    PublicJsonArray.name.add(jsonObject.getString("name"));
                    PublicJsonArray.title.add(jsonObject.getString("title"));
                    PublicJsonArray.level.add(jsonObject.getInt("level"));
                    PublicJsonArray.body.add(jsonObject.getString("body"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            TextView textView = (TextView)findViewById(R.id.text_view);
            textView.setMovementMethod(ScrollingMovementMethod.getInstance());
            textView.append("\r\n");
            textView.append(PublicJsonArray.body.size() + "項目あります" + "\r\n");
            for(int i = 0; i < PublicJsonArray.body.size(); i++){
                //配列に格納した情報をTextViewにそのまま表示
                textView.append("施設ID : " + PublicJsonArray.facility_id.get(i).toString() + "\r\n ");
                textView.append("ニックネーム : " + PublicJsonArray.name.get(i) + "\r\n ");
                textView.append("タイトル : " + PublicJsonArray.title.get(i) + "\r\n ");
                textView.append("評価 : " + PublicJsonArray.level.get(i).toString() + "\r\n ");
                textView.append("テキスト : " + PublicJsonArray.body.get(i) + "\r\n ");
                textView.append("\r\n \r\n ");
            }

        }
    };
    getTask.execute(""); //ここに施設IDを入力するとフィルタリングできる(例 : 2/)

//GetTaskクラス
import android.os.AsyncTask;

public abstract class GetTask extends AsyncTask<String, Void, String>{

    @Override
    protected abstract void onPostExecute(String result);

    @Override
    protected String doInBackground(String... strings) {
        String URL = "http://X.X.X.X/snippets/"; //X.X.X.XはIPアドレス

        GetClass getClass = new GetClass();
        String str = getClass.Getexecute(URL);
        return str;
    }

}    

//GetClassクラス
public class GetClass {
    /**
     * GETメソッドで文字列を取得する。
     *
     * @param URL   アクセスするURL
     * @return レスポンス
     */
    public String Getexecute(String URL) {
        HttpURLConnection urlConnection = null;
        int responseCode = 0;
        String responseData = "";
        try {
            //ステップ1:接続URLを決める。
            URL url = new URL(URL);

            //ステップ2:URLへのコネクションを取得する。
            urlConnection = (HttpURLConnection) url.openConnection();
            //ステップ3:接続設定(メソッドの決定,タイムアウト値,ヘッダー値等)を行う。
            //接続タイムアウトを設定する。
            urlConnection.setConnectTimeout(100000);
            //レスポンスデータ読み取りタイムアウトを設定する。
            urlConnection.setReadTimeout(100000);
            //ヘッダーにUser-Agentを設定する。
            urlConnection.setRequestProperty("User-Agent", "Android");
            //ヘッダーにAccept-Languageを設定する。
            urlConnection.setRequestProperty("Accept-Language", Locale.getDefault().toString());
            //HTTPのメソッドをGETに設定する。
            urlConnection.setRequestMethod("GET");
            //リクエストのボディ送信を許可しない
            urlConnection.setDoOutput(false);
            //レスポンスのボディ受信を許可する
            urlConnection.setDoInput(true);
            //ステップ4:コネクションを開く
            urlConnection.connect();
            //ステップ6:レスポンスボディの読み出しを行う。
            responseCode = urlConnection.getResponseCode();
            responseData = convertToString(urlConnection.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                //ステップ7:コネクションを閉じる。
                urlConnection.disconnect();
            }
        }
        Log.d("execute", "URL:" + URL);
        Log.d("execute", "HttpStatusCode:" + responseCode);
        Log.d("execute", "ResponseData:" + responseData);
        return responseData;

    }
    public String convertToString(InputStream stream) throws IOException {
        StringBuffer sb = new StringBuffer();
        String line = "";
        BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
        while ((line = br.readLine()) != null) {
            sb.append(line);
            try {
                jsonArray = new JSONArray(line);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        try {
            stream.close();
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return sb.toString();
    }
}


django

#Views.py

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


# Create your views here.
@csrf_exempt
def snippet_list(request):
    """
    List all code snippets, or create a new snippet.
    """


    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)
                                                                                                                     op

@csrf_exempt
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """

    try:
        snippet = Snippet.objects.filter(facility_id=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet, many=True)
        return JsonResponse(serializer.data, safe=False)

#setting.py
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))



SECRET_KEY = ?

DEBUG = True

ALLOWED_HOSTS = ["X.X.X.X"]



INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',                                                                                                 p
    'snippets.apps.SnippetsConfig',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'tutorial.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'tutorial.wsgi.application'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',                           p
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]



LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

APPEND_SLASH = False

STATIC_URL = '/static/'
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • bakara1332

    2018/10/29 11:48

    ちなみにAWSを使っています。

    キャンセル

  • Meganezaru

    2018/10/29 12:08

    サーバーでcacheを返す場合は、304が戻るはずですので、それが戻ってきてないということであれば、ブラウザのキャッシュが効いているかもしれないですね。

    キャンセル

  • bakara1332

    2018/10/29 12:27

    ブラウザでは更新した情報を表示してくれるんですが、android studioを使った実機テストでうまく表示してくれません。android studio又は実機の方でcache設定的なものがある可能性ってありますかね?

    キャンセル

回答 1

checkベストアンサー

+2

サーバーサイドではなく、Java部分が影響しているようですね。
(Javaは勉強したことがあるレベル・・・(^_^;)なので、詳細はわかりかねます。申し訳ないです。)

URLConnectionには、cacheにまつわる設定があるようですので、
設定内容を確認してみてはどうでしょうか?

getUseCaches();

cacheを使わないようにするには、

setUseCaches(False);

とすれば、良いようです。

setUseCaches

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/05 14:15

    色々と調べてみた結果、解決することができましたので一応載せておきます!
    HttpURLConnectionクラスにおけるキャッシュ関連のメソッドにはsetUseCaches(boolean)やsetDefaultCaches(boolean)がありましたが、私の場合はconnect()前にurlConnection.setRequestProperty("Cache-Control", "no-cache")と入力することによって目的の動作にすることができました。

    キャンセル

  • 2018/11/05 16:36

    解決してよかったです^_^
    私も、Javaを利用する時には、参考にさせてもらいます!

    キャンセル

  • 2018/11/05 16:56

    ぜひぜひ!
    最後までお付き合いいただきありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • djangoのGetメソッドについて。Getリクエスト受け取り毎に更新後情報が欲しいのに、更新前?の情報が返ってくる。