Как использовать контроллер пользователей Ruby on Rails через Unity (C #) для регистрации нового пользователя? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть пользовательский контроллер, созданный с помощью учебника hartl, который регистрирует новых пользователей через форму с вводом электронной почты и пароля.Это работает правильно.Я пытаюсь отправить HttpWebRequest из проигрывателя редактора Unity на мой сервер, чтобы зарегистрировать нового пользователя из строки пароля, созданной в Unity.Я предоставил ответ об ошибке и код, относящийся к попытке ниже.

WebException: удаленный сервер возвратил ошибку: (422) Unprocessable Entity.System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult AsyncResult) (при> <4b9f316768174388be8ae5baf2e6cc02>: 0) System.Net.HttpWebRequest.GetResponse () (при <4b9f316768174388be8ae5baf2e6cc02>: 0) UnityStandardAssets.Characters.RigidbodyFirstPersonController.RigidbodyFirstPer> sonController.resetScene3() (at> Assets / Scripts / RigidbodyFirstPersonController.cs: 463)

Код HttpWebRequest от RigidbodyFirstPer> sonController.resetScene3 ():

public static string _url = "https://immense-castle-53592.herokuapp.com/signup";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(_url);
    request.Method = "POST";
    request.Headers ["action"] = "/users";
    request.Headers ["class"] = "new_user";
    request.Headers ["id"] = "new_user";
    request.Headers ["utf8"] = "&#x2713;";
    request.Headers ["authenticity_token"] = "NNb6+J/j46LcrgYUC60wQ2titMuJQ5lLqyAbnbAUkdo=";
    request.Headers ["user_email"] = "jakebrantley44@gmail.com";
    request.Headers ["user_password"] = passwordUnity;

        using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            Debug.Log("Publish Response: " + (int)response.StatusCode + ", " + response.StatusDescription);
            if((int)response.StatusCode == 200)
            {
                //SetEnvironmentVersion(version);
            }
        }    

Пользователи Ruby on Rails1010 * class UsersController < ApplicationController def show @user = User.find(params[:id]) end def new @user = User.new end def create @user = User.new(user_params) puts params[:password] if @user.save log_in @user flash[:success] = "Welcome to your vault!" redirect_to @user else render 'new' end end def edit @user = User.find(params[:id]) end private def user_params params.require(:user).permit(:email, :password) end end Routes.rb Rails.application.routes.draw do get 'sessions/new' root 'static_pages#home' get '/help', to: 'static_pages#help' get '/demo', to: 'static_pages#demo' get '/about', to: 'static_pages#about' get '/contact', to: 'static_pages#contact' get '/signup', to: 'users#new' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' post '/signup', to: 'users#create' post '/', to: 'users#create' get '/show', to: 'users#create' delete '/logout', to: 'sessions#destroy' resources :users end Обновление: новый код при попытке использовать Stream.HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(_url); // Set the ContentType property of the WebRequest. request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; // Add dictionary strings headers["action"] = "/users"; headers["class"] = "new_user"; headers["id"] = "new_user"; headers["utf8"] = "&#x2713;"; headers["authenticity_token"] = "NNb6+J/j46LcrgYUC60wQ2titMuJQ5lLqyAbnbAUkdo="; headers["user_email"] = "jakebrantley44@gmail.com"; headers["user_password"] = passwordUnity; byte[] headersByte = UnityWebRequest.SerializeSimpleForm(headers); // Set the ContentLength property of the WebRequest. request.ContentLength = headersByte.Length; Debug.Log( headersByte ); // Get the request stream. Stream dataStream = request.GetRequestStream (); // Write the data to the request stream. dataStream.Write (headersByte, 0, headersByte.Length); // Close the Stream object. dataStream.Close (); // Get the response. using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { // Display the status. Console.WriteLine (((HttpWebResponse)response).StatusDescription); // Get the stream containing content returned by the server. dataStream = response.GetResponseStream (); // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader (dataStream); //Read the content string responseFromServer = reader.ReadToEnd (); // Display the content. Console.WriteLine (responseFromServer); Debug.Log(responseFromServer); reader.Close (); dataStream.Close (); response.Close (); Debug.Log("Publish Response: " + (int)response.StatusCode + ", " + response.StatusDescription); if((int)response.StatusCode == 200) { } }

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Решено!

  1. Изменен метод сообщения с Http.Web.Request на UnityWebRequest.Заголовки Http.Web.Request не предназначены для передачи параметров.
  2. Изменена функция Ruby / Rails users_controller.rb user_params.Контроллер должен быть установлен на .fetch значения параметров:
def user_params
    puts "user_params runs"
    unless params["user"].blank?
        puts "main state user_params"
        params.fetch(:user, {:email => params[:EMAIL], :password => params[:PASSWORD]}).permit(:email, :password)
    end
    puts "unless state in user_params"
    params.fetch(:user, {"email"=>params[:EMAIL], "password"=>params[:PASSWORD]}).permit(:email, :password)
end
0 голосов
/ 17 октября 2018

Код ruby ​​ищет параметры :email и :password, но на стороне клиента вместо него вы добавляете user_email и user_password в заголовок.

Также на основеобновленный код, я думаю, вы должны поставить

if((int)response.StatusCode == 200)
{

}

перед response.Close();.

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