質問編集履歴
5
ソースコードなど、構成の変更
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
|
-
|
1
|
+
文字数の関係で変更前の情報は削除させて頂きました。保管しておきますので、変更前の情報が知りたい方がいましたらすぐに提示します。
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
|
13
|
-
|
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(
|
17
|
+
facility = models.CharField('施設名', max_length=100)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
31
|
-
class
|
23
|
+
class Snippet(models.Model):
|
24
|
+
|
32
|
-
|
25
|
+
facility_id = models.ForeignKey(Facility, on_delete=models.CASCADE, default='0')
|
26
|
+
|
33
|
-
name = models.CharField(
|
27
|
+
name = models.CharField('ニックネーム', max_length=100, default='名無しさん')
|
34
|
-
|
28
|
+
|
35
|
-
|
29
|
+
title = models.CharField('タイトル', max_length=100, default='')
|
36
|
-
|
30
|
+
|
37
|
-
level = models.IntegerField(
|
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
|
-
|
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
|
49
|
+
class SnippetSerializer(serializers.ModelSerializer):
|
56
|
-
|
57
|
-
|
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
|
-
|
51
|
+
class Meta:
|
106
|
-
|
107
|
-
|
52
|
+
|
108
|
-
|
109
|
-
|
53
|
+
model = Snippet
|
110
|
-
|
54
|
+
|
111
|
-
|
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
|
-
r
|
119
|
+
return HttpResponse(status=404)
|
120
|
+
|
121
|
+
|
122
|
+
|
132
|
-
|
123
|
+
if request.method == 'GET':
|
124
|
+
|
125
|
+
serializer = SnippetSerializer(snippet, many=True)
|
126
|
+
|
133
|
-
r
|
127
|
+
return JsonResponse(serializer.data, safe=False)
|
134
|
-
|
135
|
-
|
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('
|
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
修正
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
修正
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
修正
test
CHANGED
File without changes
|
test
CHANGED
File without changes
|
1
修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
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
|
+
宜しくお願いします。
|