2016-09-21 1 views
3

Я могу получить данные из базы данных, используя retrofit и REST api, но сталкиваясь с ошибками при отправке данных. Сообщение работает с использованием postman, но не через retrofit. Мне не удалось найти ошибку. Я попытался изменить конечную точку, то есть «отдохнуть» и «отдохнуть /», но все равно получить не найденную ошибку.Как решить 404 на Retrofit @POST на Django RESTful API?

ApiView почт в Django RESTful API: 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

Вы должны знать значения отклика кода RESTful услуг. 404 означает, что страница, к которой вы пытаетесь получить доступ, не существует – SripadRaj

+0

Я знаю это, но для почтальона я использую url «http://192.168.1.50:80/rest», а в android мой базовый url «http: //192.168 .1.50: 80 /». так почему я столкнулся с 404. Для получения моего URL-адреса тот же «http://192.168.1.50:80/rest», и это не дает мне никаких проблем. – Sid

+0

Я думаю, что строка «serializer.is_valid()» возвращает false в rest api, но я не понимаю причину этого. – 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

Сначала я включил шаблон url, предложенный Dinesh Mandepudi. Затем я сделал изменения в моем регулярном выражении в модификации. Это была проблема с URL, с которой я не сталкивался при использовании почтальона. Я просто добавил '/' в начале моего регулярного выражения.

public interface ApiInterface { 

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

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

Также глупая ошибка, я пытался добавить строку 13 в длину столбца базы данных, в то время как я установил лимит до 10.

Смежные вопросы