Приложение Rails всегда возвращает «Unprocessable Entity» в Android - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь подключить приложение Android к приложению RoR, чтобы оно могло создать нового пользователя, но независимо от того, что я делаю, я всегда получаю «Unprocessable Entity».Сейчас я использую Kotlin вместо Java.

users_controller.rb

class Api::V1::UsersController < ApplicationController

  before_action :set_article, only: [:show, :update, :destroy]

  def show
    render json: @article
  end

  def create
    @user = User.new(user_params)
    if @user.save
      render json: @user, status: :created, location: api_v1_article_url(@user)
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  def update
    if @article.update(article_params)
      render json: @article
    else
      render json: @article.errors, status: :unprocessable_entity
    end
  end

  def destroy
    @article.destroy
  end

  private

    def set_article
      @article = Article.find(params[:id])
    end

    def user_params
      params.permit(:name, :lastName, :email, :password, :password_confirmation)
    end

end

MainActivity.kt

internal inner class UserCreator : AsyncTask<String, Void, String>() {

    override fun doInBackground(vararg params: String): String {
        lateinit var response: StringBuffer
        try{
            val mURL = URL("http://10.0.2.2:3000/api/v1/users")
            val reqParam = JSONObject()
            val holder = JSONObject()
            reqParam.put("name", params[0])
            reqParam.put("lastName", params[1])
            reqParam.put("email", params[2])
            reqParam.put("password", params[3])
            reqParam.put("password_confirmation", params[4])
            holder.put("user", reqParam)
            with(mURL.openConnection() as HttpURLConnection) {
                requestMethod = "POST"
                val wr = OutputStreamWriter(getOutputStream());
                wr.write(holder.toString());
                wr.flush();
                println("URL : $url")
                println("Response Code : $responseCode")
                BufferedReader(InputStreamReader(inputStream)).use {
                    response = StringBuffer()
                    var inputLine = it.readLine()
                    while (inputLine != null) {
                        response.append(inputLine)
                        inputLine = it.readLine()
                    }
                    it.close()
                }
            }
        }catch(e: RuntimeException){
            Toast.makeText(this@MainActivity, e.message, Toast.LENGTH_LONG).show()
        }
        return response.toString()
    }
}

Кто-то знает, что я делаю не так?Я понимаю, что должен отправить JSONObject () с запросом POST, но он не позволяет мне это сделать, я могу только отправлять строки.

ОШИБКА

Started POST "/api/v1/users" for 127.0.0.1 at 2018-12-27 20:26:09 -0600
Processing by Api::V1::UsersController#create as HTML
  Parameters: {"{\"name\":\"Test\",\"lastName\":\"Tester\",\"email\":\"test@test.com\",\"password\":\"foobar\",\"password_confirmation\":\"foobar\"}"=>"[FILTERED]"}
Unpermitted parameter: :{"name":"Test","lastName":"Tester","email":"test@test.com","password":"foobar","password_confirmation":"foobar"}
   (0.7ms)  BEGIN
  app/controllers/api/v1/users_controller.rb:11
  User Exists (3.9ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT $1  [["LIMIT", 1]]
  app/controllers/api/v1/users_controller.rb:11
   (0.4ms)  ROLLBACK
  app/controllers/api/v1/users_controller.rb:11
Completed 422 Unprocessable Entity in 174ms (Views: 2.4ms | ActiveRecord: 38.6ms)

1 Ответ

0 голосов
/ 28 декабря 2018

Итак ... Посмотрев код моего приложения для Android, я понял, что посылаю в приложение RoR просто строку, а не объект Json, поэтому я изменил ее, используя устаревшие классы "DefaultHttpClient ()", "HttpPost () "и т. д. (я не люблю использовать устаревшие классы, но ...), и это сработало!Большое спасибо Джею Дорси за время, потраченное на решение этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...