Каждый, кто недавно разрабатывал сервер-клиентскую систему, на стороне сервера я использую django и restframework для взаимодействия с приложениями для Android. На стороне клиента я использую android и модернизацию для отправки и получения данных с сервера. Когда я получаю данные с сервера, все в порядке, но когда я пытаюсь отправить данные с android на django, возникают некоторые ошибки. В частности, он успешно отправляет данные на сервер, но не отображается в представлениях Django.
Сначала я использую почтальон, чтобы проверить, могу ли я публиковать данные на URL http://192.168.*.**:8001/api/output
, и это работает, но когда я использую приложение для Android для отправки данных на http://192.168.*.**:8001/api/output
, оно также может успешно публиковать
Вот мой код сервера django
class OutputInfoView(ModelViewSet):
serializer_class = OutPutInfoSerializer
def get_queryset(self):
return models.OutputInfo.objects.all()
class OutPutInfoSerializer(serializers.ModelSerializer):
class Meta:
model = models.OutputInfo
fields = ['id', 'user', 'lx', 'ly', 'room', 'activity', 'sound']
# router url
routers = routers.DefaultRouter()
routers.register(r'output', views.OutputInfoView,basename='OutputInfo')
urlpatterns = [
path('', include(routers.urls))
# path('output', views.OutputInfoView.as_view(), name='output'),
]
В моем клиенте для Android я модифицировал пользователя для публикации данных:
public interface JsonPlaceHolderAPI {
@Headers({"Content-Type: application/json"})
@POST("output")
Call<List<Sender>> createUser(@Body RequestBody body);
}
Это основной вид деятельности loading
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.*.**:8001/api/") // restapi的BASE地址
.addConverterFactory(GsonConverterFactory.create()) // 添加jsonparse
.client(okHttpClient)
.build();
jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderAPI.class);
createSend();
// send post json data to server
private void createSend(){
Sender send = new Sender("2","35","43","sdf","gredf","4dfe");
Gson gson = new Gson();
String route = gson.toJson(send);
Log.d("TAG", route);
RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route);
Call<List<Sender>> call = jsonPlaceHolderApi.createUser(body);
call.enqueue(new Callback<List<Sender>>() {
@Override
public void onResponse(Call<List<Sender>> call, Response<List<Sender>> response) {
if (response.isSuccessful()){
showText.setText("successfuly send");
}else{
showText.setText("Code: " + response.code());
return;
}
}
@Override
public void onFailure(Call<List<Sender>> call, Throwable t) {
showText.setText(t.getMessage());
}
});
}
После того, как я разверну все эти шаги, я сначала использую почтальон, чтобы проверить, могу ли я публиковать данные на URL http://192.168.*.**:8001/api/output
, и он работает, но когда я использую приложение Android для отправки данных поста на http://192.168.*.**:8001/api/output
, он также может публиковать успешно следующим образом:
D/OkHttp: --> POST http://192.168.0.11:8001/api/output
D/OkHttp: Content-Type: application/json
Content-Length: 79
{"activity":"gredf","lx":"35","ly":"43","room":"sdf","sound":"4dfe","user":"2"}
--> END POST (79-byte body)
D/OkHttp: <-- 200 OK http://192.168.0.11:8001/api/output/ (94ms)
Date: Thu, 27 Jun 2019 02:30:55 GMT
Server: WSGIServer/0.2 CPython/3.7.1
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, POST, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 371
D/OkHttp: [{"id":1,"user":1,"lx":"25","ly":"35","room":"classroom","activity":"walk","sound":"speak"},{"id":2,"user":2,"lx":"12","ly":"79","room":"restroom","activity":"stand","sound":"silence"},{"id":3,"user":1,"lx":"22","ly":"19","room":"restroom","activity":"stand","sound":"silence"},{"id":4,"user":1,"lx":"22","ly":"19","room":"restroom","activity":"stand","sound":"silence"}]
<-- END HTTP (371-byte body)
Apparenetly, данные не отправляются на сервер успешно, мне интересно, где я был не прав, я думаю, что сделал все, что мог ..
android Отправить данные поста на django