質問編集履歴

5

ソースコードなど、構成の変更

2018/07/28 12:48

投稿

bakara1332
bakara1332

スコア13

test CHANGED
File without changes
test CHANGED
@@ -1,157 +1,491 @@
1
- ```JSON
2
-
3
- {"body":"テキスト","id":1,"level":3,"name":"なまえ"}
4
-
5
- ```
6
-
7
-
8
-
9
- Django側で、POSTメソッドとして上記ようなJSONデータを受け取データベースに保存したいと考えております。
1
+ 文字数の関係で変更前の情報削除させて頂きまた。保管しおきますで、変更前の情報が知りたい方がいしたらぐに提示します
10
-
11
-
12
-
2
+
13
- POSTメソッド送信はjava(android studio)を使いた思っていす。
3
+ ↓ 変更点(回答者様URLを参考させて頂いたので構造はURLのものり変わりません) ↓
14
-
15
-
16
-
17
- models.pyはこんな感じです。
18
4
 
19
5
 
20
6
 
21
7
  ```python
22
8
 
9
+ #models.py
10
+
11
+
12
+
23
13
  class Facility(models.Model):
24
14
 
15
+ id = models.IntegerField('施設ID', primary_key=True)
16
+
25
- facility = models.CharField(u'施設名', max_length=100)
17
+ facility = models.CharField('施設名', max_length=100)
26
-
27
-
28
-
29
-
30
-
18
+
19
+
20
+
21
+
22
+
31
- class Comment(models.Model):
23
+ class Snippet(models.Model):
24
+
32
-
25
+ facility_id = models.ForeignKey(Facility, on_delete=models.CASCADE, default='0')
26
+
33
- name = models.CharField(u'ニックネーム', max_length=100, primary_key=True)
27
+ name = models.CharField('ニックネーム', max_length=100, default='名無しさん')
34
-
28
+
35
- body = models.TextField(u'テキスト')
29
+ title = models.CharField('タイ', max_length=100, default='')
36
-
30
+
37
- level = models.IntegerField(u'評価')
31
+ level = models.IntegerField('評価', default=3)
32
+
38
-
33
+ body = models.TextField()
34
+
35
+ linenos = models.BooleanField(default=False)
36
+
37
+ language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
38
+
39
- id = models.ForeignKey(u'施設名', Facility, on_delete=models.CASCADE)
39
+ style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)
40
-
41
-
42
-
40
+
43
- ```
41
+ ```
44
-
45
-
46
-
47
- views.pyはこんな感じです。
48
-
49
-
50
42
 
51
43
  ```python
52
44
 
53
- #関係ないかもしれません
45
+ #serializers.py
54
-
46
+
47
+
48
+
55
- class FacilityViewSet(viewsets.ModelViewSet):
49
+ class SnippetSerializer(serializers.ModelSerializer):
56
-
57
- queryset = Facility.objects.all()
50
+
58
-
59
- serializer_class = FacilitySerializer
60
-
61
-
62
-
63
- #関係ないかもしれません
64
-
65
- class CommentViewSet(viewsets.ModelViewSet):
66
-
67
- queryset = Comment.objects.all()
68
-
69
- serializer_class = CommentSerializer
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
- #このクラスです
78
-
79
- class JSONParsingMiddleware(MiddlewareMixin):
80
-
81
-
82
-
83
- def process_request(self, request):
84
-
85
- if (request.method == "POST") and (request.content_type == "application/json"):
86
-
87
- try:
88
-
89
- request.JSON = json.loads(request.body.decode("utf-8"))
90
-
91
- except ValueError as ve:
92
-
93
- return HttpResponseBadRequest("unable to parse JSON data. Error : {0}".format(ve))
94
-
95
- name = request.JSON["name"]
96
-
97
- body = request.JSON["body"]
98
-
99
- level = request.JSON["level"]
100
-
101
- facility = request.JSON["id"]
102
-
103
- m = Facility.objects.select_related().get(id=facility)
104
-
105
- m.name = name
51
+ class Meta:
106
-
107
- m.body = body
52
+
108
-
109
- m.level = level
53
+ model = Snippet
110
-
54
+
111
- m.save()
55
+ fields = ('facility_id', 'name', 'title', 'level', 'body')
112
-
113
-
114
-
56
+
115
- ```
57
+ ```
116
-
117
-
118
-
119
- models.pyやviews.pyの記述方式はこれで合っていますでしょうか?
120
-
121
- また、urls.pyについてまだ理解が足りないのですが、urls.pyも何かを記述する必要があるのでしょうか?
122
-
123
-
124
-
125
- プロジェクトの名前は「RestApi」,アプリの名前は「jingu」としてあります。
126
-
127
- <jingu/urls.py>
128
58
 
129
59
  ```python
130
60
 
61
+ #views.py
62
+
63
+
64
+
65
+ @csrf_exempt
66
+
67
+ def snippet_list(request):
68
+
69
+ """
70
+
71
+ List all code snippets, or create a new snippet.
72
+
73
+ """
74
+
75
+ if request.method == 'GET':
76
+
77
+ snippets = Snippet.objects.all()
78
+
79
+ serializer = SnippetSerializer(snippets, many=True)
80
+
81
+ return JsonResponse(serializer.data, safe=False)
82
+
83
+
84
+
85
+ elif request.method == 'POST':
86
+
87
+ data = JSONParser().parse(request)
88
+
89
+ serializer = SnippetSerializer(data=data)
90
+
91
+ if serializer.is_valid():
92
+
93
+ serializer.save()
94
+
95
+ return JsonResponse(serializer.data, status=201)
96
+
97
+ return JsonResponse(serializer.errors, status=400)
98
+
99
+
100
+
101
+
102
+
103
+ @csrf_exempt
104
+
105
+ def snippet_detail(request, pk):
106
+
107
+ """
108
+
109
+ Retrieve, update or delete a code snippet.
110
+
111
+ """
112
+
113
+ try:
114
+
115
+ snippet = Snippet.objects.filter(facility_id=pk)
116
+
117
+ except Snippet.DoesNotExist:
118
+
131
- router = routers.DefaultRouter()
119
+ return HttpResponse(status=404)
120
+
121
+
122
+
132
-
123
+ if request.method == 'GET':
124
+
125
+ serializer = SnippetSerializer(snippet, many=True)
126
+
133
- router.register('Facilitys', FacilityViewSet)
127
+ return JsonResponse(serializer.data, safe=False)
134
-
135
- router.register('comments', CommentViewSet)
128
+
136
-
137
- ```
129
+ ```
138
-
139
-
140
-
141
- <RestApi/urls.py>
142
130
 
143
131
  ```python
144
132
 
133
+ #urls.py
134
+
135
+
136
+
137
+ #プロジェクトレベル?
138
+
145
139
  urlpatterns = [
146
140
 
147
141
  path('admin/', admin.site.urls),
148
142
 
149
- url('api/', include(jingu_router.urls)),
143
+ url(r'^', include('snippets.urls')),
150
144
 
151
145
  ]
152
146
 
153
147
 
154
148
 
149
+ #アプリレベル?
150
+
151
+ urlpatterns = [
152
+
153
+ url(r'^snippets/$', views.snippet_list),
154
+
155
+ url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail),
156
+
157
+ ]
158
+
155
- ```
159
+ ```
160
+
161
+
162
+
156
-
163
+ またandroid studioの方はこんな感じになっております。これを実行しても、django側では何も起こらず下記のようなエラーになります。
164
+
165
+
166
+
167
+ Run
168
+
169
+ ```
170
+
171
+
172
+
173
+ W/System.err: java.net.SocketTimeoutException: timeout
174
+
175
+ W/System.err: at com.android.okhttp.okio.Okio$3.newTimeoutException(Okio.java:212)
176
+
177
+ at com.android.okhttp.okio.AsyncTimeout.exit(AsyncTimeout.java:261)
178
+
179
+ at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:215)
180
+
181
+ at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
182
+
183
+ at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
184
+
185
+ at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
186
+
187
+ at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
188
+
189
+ at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
190
+
191
+ at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:906)
192
+
193
+ at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:782)
194
+
195
+ at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:463)
196
+
197
+ at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
198
+
199
+ at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:521)
200
+
201
+ at com.example.cso22.posttodjango.HttpSendJSON.execute(HttpSendJSON.java:63)
202
+
203
+ at com.example.cso22.posttodjango.PostExecute.doInBackground(PostExecute.java:32)
204
+
205
+ at com.example.cso22.posttodjango.PostExecute.doInBackground(PostExecute.java:9)
206
+
207
+ at android.os.AsyncTask$2.call(AsyncTask.java:316)
208
+
209
+ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
210
+
211
+ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
212
+
213
+ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
214
+
215
+ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
216
+
217
+ at java.lang.Thread.run(Thread.java:776)
218
+
219
+ Caused by: java.net.SocketException: Socket closed
220
+
221
+ at java.net.SocketInputStream.socketRead0(Native Method)
222
+
223
+ at java.net.SocketInputStream.read(SocketInputStream.java:151)
224
+
225
+ at java.net.SocketInputStream.read(SocketInputStream.java:120)
226
+
227
+ at com.android.okhttp.okio.Okio$2.read(Okio.java:136)
228
+
229
+ at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
230
+
231
+ ... 19 more
232
+
233
+ ```
234
+
235
+
236
+
237
+ ソースコードです
238
+
239
+ ```java
240
+
241
+
242
+
243
+ public class MainActivity extends AppCompatActivity {
244
+
245
+
246
+
247
+ private static final String TAG = "Hello";
248
+
249
+
250
+
251
+ @Override
252
+
253
+ protected void onCreate(Bundle savedInstanceState) {
254
+
255
+ super.onCreate(savedInstanceState);
256
+
257
+ setContentView(R.layout.activity_main);
258
+
259
+
260
+
261
+ PostExecute postJson = new PostExecute();
262
+
263
+ postJson.execute();
264
+
265
+ }
266
+
267
+ }
268
+
269
+
270
+
271
+ public class PostExecute extends AsyncTask<Void, Void, String> {
272
+
273
+
274
+
275
+ @Override
276
+
277
+ protected void onPostExecute(String response){
278
+
279
+ System.out.println(response);
280
+
281
+ }
282
+
283
+
284
+
285
+ @Override
286
+
287
+ protected String doInBackground(Void... Void) {
288
+
289
+
290
+
291
+ //{"facility_id" : 3, "name" : "名前", "title" : "タイトル", "level": 3, "body" : "テキスト"}
292
+
293
+ String name = "名前", title = "タイトル", body = "テキスト";
294
+
295
+ int level = 3, facility_id = 3;
296
+
297
+
298
+
299
+ String URL = "http://192.168.1.3/snippets";
300
+
301
+
302
+
303
+ HashMap<String, Object> jsonMap = new HashMap<>();
304
+
305
+ jsonMap.put("facility_id", facility_id);
306
+
307
+ jsonMap.put("name", name);
308
+
309
+ jsonMap.put("title", title);
310
+
311
+ jsonMap.put("level", level);
312
+
313
+ jsonMap.put("body", body);
314
+
315
+
316
+
317
+
318
+
319
+ HttpSendJSON httpSendJSON = new HttpSendJSON();
320
+
321
+ String response = httpSendJSON.execute(URL, jsonMap);
322
+
323
+ return response;
324
+
325
+ }
326
+
327
+
328
+
329
+
330
+
331
+ }
332
+
333
+
334
+
335
+ public class HttpSendJSON {
336
+
337
+ public String execute(String argStrApiUrl, HashMap<String,Object> jsonMap) {
338
+
339
+ String ret = "";
340
+
341
+ HttpURLConnection urlConnection = null;
342
+
343
+ try {
344
+
345
+ //ステップ1.接続URLを決める。
346
+
347
+ URL url = new URL(argStrApiUrl);
348
+
349
+
350
+
351
+ //ステップ2.URLへのコネクションを取得する。
352
+
353
+ urlConnection = (HttpURLConnection) url.openConnection();
354
+
355
+
356
+
357
+ //ステップ3.接続設定(メソッドの決定,タイムアウト値,ヘッダー値等)を行う。
358
+
359
+ //接続タイムアウトを設定する。
360
+
361
+ urlConnection.setConnectTimeout(100000);
362
+
363
+ //レスポンスデータ読み取りタイムアウトを設定する。
364
+
365
+ urlConnection.setReadTimeout(100000);
366
+
367
+ //ヘッダーにUser-Agentを設定する。
368
+
369
+ urlConnection.setRequestProperty("User-Agent", "Android");
370
+
371
+ //ヘッダーにAccept-Languageを設定する。
372
+
373
+ urlConnection.setRequestProperty("Accept-Language", Locale.getDefault().toString());
374
+
375
+ //ヘッダーにContent-Typeを設定する
376
+
377
+ urlConnection.addRequestProperty("Content-Type", "application/json; charset=UTF-8");
378
+
379
+ //HTTPのメソッドをPOSTに設定する。
380
+
381
+ urlConnection.setRequestMethod("POST");
382
+
383
+ //リクエストのボディ送信を許可する
384
+
385
+ urlConnection.setDoOutput(true);
386
+
387
+ //レスポンスのボディ受信を許可する
388
+
389
+ urlConnection.setDoInput(true);
390
+
391
+
392
+
393
+ //ステップ4.コネクションを開く
394
+
395
+ urlConnection.connect();
396
+
397
+
398
+
399
+ //ステップ5:リクエストボディの書き出しを行う。
400
+
401
+ OutputStream outputStream = urlConnection.getOutputStream();
402
+
403
+ if (jsonMap.size() > 0) {
404
+
405
+ //JSON形式の文字列に変換する。
406
+
407
+ JSONObject responseJsonObject = new JSONObject(jsonMap);
408
+
409
+ String jsonText = responseJsonObject.toString();
410
+
411
+ PrintStream ps = new PrintStream(urlConnection.getOutputStream());
412
+
413
+ ps.print(jsonText);
414
+
415
+ ps.close();
416
+
417
+ }
418
+
419
+ outputStream.close();
420
+
421
+
422
+
423
+ //ステップ6.レスポンスボディの読み出しを行う。
424
+
425
+ int responseCode = urlConnection.getResponseCode();
426
+
427
+ ret = convertToString(urlConnection.getInputStream());
428
+
429
+ Log.d("execute", "URL:" + argStrApiUrl);
430
+
431
+ Log.d("execute", "HttpStatusCode:" + responseCode);
432
+
433
+ Log.d("execute", "ResponseData:" + ret);
434
+
435
+ } catch (IOException e) {
436
+
437
+ e.printStackTrace();
438
+
439
+ } finally {
440
+
441
+ if (urlConnection != null) {
442
+
443
+ //7.コネクションを閉じる。
444
+
445
+ urlConnection.disconnect();
446
+
447
+ }
448
+
449
+ }
450
+
451
+ return ret;
452
+
453
+ }
454
+
455
+
456
+
457
+ public String convertToString(InputStream stream) throws IOException {
458
+
459
+ StringBuffer sb = new StringBuffer();
460
+
461
+ String line = "";
462
+
463
+ BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
464
+
465
+ while ((line = br.readLine()) != null) {
466
+
467
+ sb.append(line);
468
+
469
+ }
470
+
471
+ try {
472
+
473
+ stream.close();
474
+
475
+ } catch (Exception e) {
476
+
477
+ e.printStackTrace();
478
+
479
+ }
480
+
481
+ return sb.toString();
482
+
483
+ }
484
+
485
+ }
486
+
487
+ ```
488
+
489
+
490
+
157
- しくお願いします。
491
+ 長文申訳ありません。よろしくお願いします。

4

修正

2018/07/28 12:48

投稿

bakara1332
bakara1332

スコア13

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- POSTメソッドはjava(android studio)を使いたいと思っています。
13
+ POSTメソッドの送信にはjava(android studio)を使いたいと思っています。
14
14
 
15
15
 
16
16
 

3

修正

2018/07/24 00:15

投稿

bakara1332
bakara1332

スコア13

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,3 @@
1
- 前質問させていただいてから変わった点があるので、また質問させて頂きます。
2
-
3
-
4
-
5
1
  ```JSON
6
2
 
7
3
  {"body":"テキスト","id":1,"level":3,"name":"なまえ"}

2

修正

2018/07/24 00:14

投稿

bakara1332
bakara1332

スコア13

test CHANGED
File without changes
test CHANGED
File without changes

1

修正

2018/07/24 00:14

投稿

bakara1332
bakara1332

スコア13

test CHANGED
@@ -1 +1 @@
1
- 再度投稿します [Django] postされたデータをDB(sqlite)に保存する方法が分からない
1
+ [Django] postされたデータをDB(sqlite)に保存する方法が分からない
test CHANGED
@@ -123,3 +123,39 @@
123
123
  models.pyやviews.pyの記述方式はこれで合っていますでしょうか?
124
124
 
125
125
  また、urls.pyについてまだ理解が足りないのですが、urls.pyも何かを記述する必要があるのでしょうか?
126
+
127
+
128
+
129
+ プロジェクトの名前は「RestApi」,アプリの名前は「jingu」としてあります。
130
+
131
+ <jingu/urls.py>
132
+
133
+ ```python
134
+
135
+ router = routers.DefaultRouter()
136
+
137
+ router.register('Facilitys', FacilityViewSet)
138
+
139
+ router.register('comments', CommentViewSet)
140
+
141
+ ```
142
+
143
+
144
+
145
+ <RestApi/urls.py>
146
+
147
+ ```python
148
+
149
+ urlpatterns = [
150
+
151
+ path('admin/', admin.site.urls),
152
+
153
+ url('api/', include(jingu_router.urls)),
154
+
155
+ ]
156
+
157
+
158
+
159
+ ```
160
+
161
+ 宜しくお願いします。