2016-09-21 18 views
3

更新データとREST APIを使用してデータを取得できましたが、投稿データにエラーがあります。ポストはpostmanを使用して動作しますが、retrofitでは使用できません。エラーを見つけることができませんでした。エンドポイントを変更しようとしました。つまり、「rest」と「rest /」ですが、 DjangoのRESTfulなAPIのポストのDjango RESTful APIのRetrofit @POSTで404を解決するには?

ApiView:view.py

def post(self,request): 
    serializer =table_restSerializer(data=request.data) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response({'results':serializer.data},status=201) 
    return Response(serializer.errors, status=404) 

urls.py

urlpatterns = [ 
     url(r'^admin/', admin.site.urls), 
     url(r'^rest',views.restSerializer.as_view()) 
    ] 
urlpatterns = format_suffix_patterns(urlpatterns) 

serializer.py:

class table_restSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = table_rest 
     fields = '__all__' 

マイアンドロイドコード: インタフェース

public interface ApiInterface { 

    @GET("rest") 
    Call<CustomViewResponse> getJsonFromSid(); 

    @POST("rest") 
    Call<CustomViewResponse> createTask(@Body CustomViewHolder task); 
} 

CustomViewHolderクラス:

public class CustomViewHolder { 

    @SerializedName("id") 
    private Integer id; 

    @SerializedName("tt") 
    private String tt; 

    @SerializedName("varr") 
    private Integer varr; 

    @SerializedName("edi") 
    private String edi; 
    public CustomViewHolder(String tt, Integer varr, String edi){ 
     this.tt = tt; 
     this.varr = varr; 
     this.edi = edi; 
    } 

    public Integer getid(){ 
     return id; 
    } 
    /*public void setid(Integer id){ 
     this.id = id; 
    }*/ 

    public String gettt() 
    { 
     return tt; 
    } 
    public void settt(String tt){ 
     this.tt = tt; 
    } 

    public Integer getvarr(){ 
     return varr; 
    } 

    public void setvarr(Integer varr){ 
     this.varr = varr; 
    } 

    public String getedi(){ 
     return edi; 
    } 

    public void setedi(String edi){ 
     this.edi = edi; 
    } 
} 

CustomViewResponse class 
public class CustomViewResponse { 

    @SerializedName("results") 
    private List<CustomViewHolder> results; 

    public List<CustomViewHolder> getResults(){ 
     return results; 
    } 
} 

MainActivity:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.sid_recycler_view); 
     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); 
     ApiInterface apiService1 = ApiClient.getClient().create(ApiInterface.class); 
     Call<CustomViewResponse> call = apiService.getJsonFromSid(); 

     CustomViewHolder cc = new CustomViewHolder("my task title",22,"a string"); 

     call.enqueue(new Callback<CustomViewResponse>() { 
      @Override 
      public void onResponse(Call<CustomViewResponse> call, Response<CustomViewResponse> response) { 
       int statuscode = response.code(); 
       List<CustomViewHolder> customViewHolders = response.body().getResults(); 

       recyclerView.setAdapter(new AdapterSid(customViewHolders, R.layout.list_item_sid, getApplicationContext())); 
      } 

      @Override 
      public void onFailure(Call<CustomViewResponse> call, Throwable t) { 
       Log.e("TAG main", t.toString()); 
      } 
     }); 
     call1.enqueue(new Callback<CustomViewResponse>() { 
      @Override 
      public void onResponse(Call<CustomViewResponse> call1, Response<CustomViewResponse> respo) { 
       int statuscode = respo.code(); 
       Log.d("Message", "code..."+respo.code() + " message..." + respo.message()); 

       CustomViewResponse respon = respo.body(); 

       if (respon == null){ 
        Log.e("Error",""+statuscode+ "......"+ respo.message()+"....null body"); 
        } 

      } 

      @Override 
      public void onFailure(Call<CustomViewResponse> call1, Throwable t) { 

       Log.e(TAG, t.toString()); 
      } 
     }); 
    } 

以下は、私のテーブル構造である:

class table_rest(models.Model): 

    tt = models.CharField(max_length=10,default = 12) 
    varr = models.IntegerField(default=30) 
    edi = models.CharField(max_length=1000,default='44') 

    def __str__(self): 
     return self.tt 

郵便配達を使用して正常に保存されます私のJSON本体は次のとおりです。

{ 
    "tt": "hello", 
    "varr": 911, 
    "edi": "emergency. Can't find solution" 
} 
+0

に上限を設定していた一方で、データベースの列に13の長さの文字列を追加しようとしていたです。 404はあなたがアクセスしようとしているページが存在しないことを意味します – SripadRaj

+0

私はこれを知っていますが、私は "http://192.168.1.50:80/rest"というURLを使用し、アンドロイドに私のベースURLは "http://192.168 .1.50:80/"。だから私は404に遭遇しています。私のURLを取得するためには、同じ "http://192.168.1.50:80/rest"であり、それは私に何か問題を与えることはありません。 – Sid

+0

私は、ライン "serializer.is_valid()"は残りのAPIでfalseを返すと思いますが、私はその理由を理解していません。 – Sid

答えて

0

URLを追加してください。

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), # Any URL starting with admin(ex: http://testdomainname.com/admin/xyz) 
    url(r'^rest/$',views.restSerializer.as_view()), # Any URL starting with only rest(ex: http://testdomainname.com/rest/) 
    url(r'^$',views.restSerializer.as_view()), # Any empty URL with '' (ex: http://testdomainname.com/) 
] 
+0

あなたが提案した変更を加えましたが、依然として404エラーが発生しています。 – Sid

+0

URLの変更に伴い、私はさらに変更を加えて解決策を見つけました。 – Sid

0

最初に私はDinesh Mandepudiが提案したURLパターンを含めました。それから、改造の際に私の正規表現に変更を加えました。私が郵便配達員を使うときに直面していなかったのは、URLの問題でした。私はちょうど私のポスト正規表現の冒頭に '/'を追加しました。

public interface ApiInterface { 

    @GET("/rest") 
    Call<CustomViewResponse> getJsonFromSid(); 

    @POST("/rest/") 
    Call<CustomViewResponse> createTask(@Body CustomViewHolder task); 
} 

また愚かな間違いは、私はあなたがRESTfulサービスの応答コードの意味を知っている必要があります10

関連する問題