Добро пожаловать в S.O.!
Итак, есть несколько вещей, которые необходимо рассмотреть здесь. Для начала, в вашем контроллере:
# For creating an expense from the android app
def post_json_expense
Expense.new(expense_params)
end
Итак, сначала вызов Expense.new
здесь только создаст новый объект, но не сохранит его в базе данных; вам также нужно позвонить save
, чтобы сделать это.
Далее, вы не возвращаете ответ вызывающему абоненту. Возможно, будет возвращено что-то вроде идентификатора нового расхода или самого расхода. Я бы предложил построить вызов так:
# For creating an expense from the android app
def post_json_expense
expense = Expense.new(expense_params)
unless expense.save
# TODO: Return an error status with some useful details
# You can get some from expense.errors
return render status: 400, json: { error: true }
end
# Render a JSON representation of the expense on successful save
render json: expense.as_json
end
Далее, на стороне клиента, вы отправляете Content-type
заголовки, что хорошо, но вы также можете отправлять Accept
заголовки, которые подскажут серверу, что вы ожидаете получить обратно:
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("Content-Type", "application/json");
params.put("Accept", "application/json");
return params;
}
Наконец, вы назначили метод для POST-маршрута на вашем сервере:
post '/api' => 'expenses#post_json_expense'
Но вы называете это как PUT из вашего приложения:
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.PUT, url, expenseObject, new Response.Listener<JSONObject>() {
Итак, по этому URL-адресу нет маршрута PUT
, поэтому запрос всегда будет сбой.
Устранение этих проблем должно дать вам успешный ответ.
Лично я обнаружил, что использование простой утилиты, такой как curl
, часто помогает отлаживать такого рода ошибки связи, когда вы не знаете, является ли проблема ошибкой кодирования на стороне приложения или серверной кодировкой (или оба). Вы можете исключить переменные, используя что-то вроде curl
, которое, как вы можете быть уверенным, сработает, а затем отладьте оттуда.
Надеюсь, это поможет вам!