現在、django標準DBであるsqliteを使ったレビューアプリのようなもの(amazonのレビューなどを想像していただけるといいかと思います)を作成しようと奮闘しております。GETリクエストによる、DBからのデータ取得はできたのですが、POSTリクエストによるDBへのデータの追加が難航している状況です。
具体的には、android端末からフィールドの情報をJSON形式で送信し、データベースに保存するという流れを想像しております。
LAN内で動くことを目標にしています。
POSTリクエスト自体は送っているのですが、django側で "POST /api/comment/ HTTP/1.1" 400 177 というエラーが出ます。
android側、django側双方でやらなければいけないことなど教えていただけると助かります。
よろしくお願いします。
def __str__(self): return self.name
class Comment(models.Model):
nickname = models.CharField(u'ニックネーム', max_length=50)
txt = models.TextField(u'コメント')
level = models.IntegerField(u'評価値')
facility = models.ForeignKey(Facility, verbose_name=u'施設名', on_delete=models.CASCADE)
def __str__(self): return self.nickname
view.py ```python class FacilityViewSet(viewsets.ModelViewSet): queryset = Facility.objects.all() serializer_class = FacilitySerializer class CommentViewSet(viewsets.ModelViewSet): queryset = Comment.objects.all() serializer_class = EntrySerializer
serializer.py
<android> MainActivity.java ```java public class MainActivity extends AppCompatActivity {python
1class FacilitySerializer(serializers.ModelSerializer): 2 class Meta: 3 model = Facility 4 fields = '__all__' 5 6 7class EntrySerializer(serializers.ModelSerializer): 8 class Meta: 9 model = Comment 10 fields = ('nickname', 'txt', 'level', 'facility')
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button3); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Gson gson = new Gson(); TextView nickname = findViewById(R.id.editText4); SpannableStringBuilder sp = (SpannableStringBuilder)nickname.getText(); TextView txt = findViewById(R.id.editText5); SpannableStringBuilder sp2 = (SpannableStringBuilder)txt.getText(); TextView level = findViewById(R.id.editText6); SpannableStringBuilder sp3 = (SpannableStringBuilder)level.getText(); TextView facility = findViewById(R.id.editText9); //SpannableStringBuilder sp4 = (SpannableStringBuilder)facility.getText(); Comments comments = new Comments(sp.toString(), sp2.toString(), Integer.parseInt(String.valueOf(sp3)), 1); comments.facility = 1; String str = gson.toJson(comments); System.out.println(gson.toJson(comments)); PostToDjango task = new PostToDjango(); task.execute(gson.toJson(comments)); } }); }
}
Comments.java ```java public class Comments { public String nickname; public String txt; public int level; public int facility; public Comments(String nikename, String txt,int level, int facility){ this.nickname = nikename; this.txt = txt; this.level = level; this.facility = facility; } }
PostTojango.java
java
1public class PostToDjango extends AsyncTask<String, Void, String> { 2 3 @Override 4 protected String doInBackground(String... string) { 5 execute("http://XXX.XXX.XXX.XXX/api/comment/", string[0]); 6 return null; 7 } 8 9 10 public String execute(String argStrApiUrl, String jsonData) { 11 String ret = ""; 12 HttpURLConnection urlConnection = null; 13 try { 14 //ステップ1.接続URLを決める。 15 URL url = new URL(argStrApiUrl); 16 17 //ステップ2.URLへのコネクションを取得する。 18 urlConnection = (HttpURLConnection) url.openConnection(); 19 20 //ステップ3.接続設定(メソッドの決定,タイムアウト値,ヘッダー値等)を行う。 21 //接続タイムアウトを設定する。 22 urlConnection.setConnectTimeout(100000); 23 //レスポンスデータ読み取りタイムアウトを設定する。 24 urlConnection.setReadTimeout(100000); 25 //ヘッダーにUser-Agentを設定する。 26 urlConnection.setRequestProperty("User-Agent", "Android"); 27 //ヘッダーにAccept-Languageを設定する。 28 urlConnection.setRequestProperty("Accept-Language", Locale.getDefault().toString()); 29 //ヘッダーにContent-Typeを設定する 30 urlConnection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 31 //HTTPのメソッドをPOSTに設定する。 32 urlConnection.setRequestMethod("POST"); 33 //リクエストのボディ送信を許可する 34 urlConnection.setDoOutput(true); 35 //レスポンスのボディ受信を許可する 36 urlConnection.setDoInput(true); 37 38 //ステップ4.コネクションを開く 39 urlConnection.connect(); 40 41 //ステップ5:リクエストボディの書き出しを行う。 42 OutputStream outputStream = urlConnection.getOutputStream(); 43 if (jsonData != null) { 44 //JSON形式の文字列に変換する。 45 PrintStream ps = new PrintStream(urlConnection.getOutputStream()); 46 ps.print(jsonData); 47 ps.close(); 48 } 49 outputStream.close(); 50 51 //ステップ6.レスポンスボディの読み出しを行う。 52 int responseCode = urlConnection.getResponseCode(); 53 54 } catch (IOException e) { 55 e.printStackTrace(); 56 } finally { 57 if (urlConnection != null) { 58 //7.コネクションを閉じる。 59 urlConnection.disconnect(); 60 } 61 } 62 return ret; 63 } 64 65 public String convertToString(InputStream stream) throws IOException { 66 StringBuffer sb = new StringBuffer(); 67 String line = ""; 68 BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 69 while ((line = br.readLine()) != null) { 70 sb.append(line); 71 } 72 try { 73 stream.close(); 74 } catch (Exception e) { 75 e.printStackTrace(); 76 } 77 return sb.toString(); 78 } 79 80} 81
まだ理解に乏しいので、解決に必要な情報をお見せできていないかもしれません。その場合はすぐに追加させていただきます。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/22 15:41