目次

2009年2月3日火曜日

Wi-portからHTTP POST

Wi-portからHTTP POSTすることを、ずいぶん試しているのですが出来ません。
作ったプロジェクトはこんなもの。


rails -d mysql posttest
プロジェクトを作った後は、modelを作ってstring型のnameとtext型のmessageというカラムを追加しました。
ruby script/generate model user
migrationファイル:XXXXXXXXX_create_users.rb
t.column :name, :string
t.column :message, :text


userというコントローラーを作り、index、new、destroy、createを追加。フォームも作って投稿出来るようにしました。

ruby script/generate controller user index new show create


user_controller
def index
@users = User.find(:all)
end

def create
@user = User.new(params[:user])#上のnewでの値を受け取っています。
if@user.save
redirect_to :action => 'index'
else
render :action => 'new'
end
end

def new
end

def destroy
@user = User.find(params[:id])
@user.destroy
flash[:notice] = '削除しました'
redirect_t


index.rhtml
<h1>Users#index</h1>

<div class ="notice"><%= h(flash[:notice])%></div>
<p><%= link_to('新規ユーザー作成', :action => 'new')%></p>


<% @users.each do |user| -%>
<li>
<%= link_to(h(user.name), :action => 'show', :id => user.id)%>
<%= link_to('削除', {:action => 'destroy', :id => user.id},
{:method => :post, :confirm => '本当に削除しますか?'})%>

</li>
<% end -%>

new.rhtml
<h1>Users#new#新しいユーザーを作る</h1>

<% form_for :user, @user,
:url=>{:action => 'create'} do |form| %>

<p>名前: <%=form.text_field :name, :size => 16 %> </p>
<p>メッセージ:<br /><%=form.text_area :message, :colse =>40, :rows => 3%> </p>

<p>
<%= form.submit 'Create' %>
</p>
<% end %>
<p><%= link_to('一覧へ戻る', :action => 'index') %></p>




ソースをのぞいてみると、

<h1>Users#new#新しいユーザーを作る</h1>

<form action="/user/create" method="post"><div style="margin:0;padding:
0"><input name="authenticity_token" type="hidden"
value="3459c27ed8923e8483d23bd0b4a8a870f248bc56" /></div>

<p>名前: <input id="user_name" name="user[name]" size="16"
type="text" /> </p>
<p>メッセージ:<br /><textarea cols="40" colse="40"
id="user_message" name="user[message]" rows="3"></textarea> </p>

<p>
<input id="user_submit" name="commit" type="submit" value="Create" />
</p>
</form>

<p><a href="/user">一覧へ戻る</a></p>

ここと
id="user_name" name="user[name]"
ここが
id="user_message" name="user[message]"
キモのようです。これを返せばいいんですよね、きっと。

wi-portでhttp postしてみましょう。
シリアル変換をしてtera termで
C192.168.0.111:3000
POST /user/create HTTP/1.1 ^M^J
HOST: 192.168.0.111:3000 ^M^J
user[name]=hoge&user[message]=hoge ^M^J

※Enterの代わりにCntrl + M, CntrlJ を打ちます。= [^M^J]
※Making Things Talk参照
しかし途中でdisconnectになってしまいます。
試しにコマンドプロンプトから

telnet 192.168.0.111 3000
POST /user/create HTTP/1.1
HOST: 192.168.0.111 3000
user[name]=hoge&user[message]=hoge

成功しません。サーバー側のステータスコードを見てみると、
Processing UserController#index (for 192.168.0.111 at 2009-02-03 20:38:01) [GET]
SQL (0.1ms) SET NAMES 'utf8'
SQL (0.1ms) SET SQL_AUTO_IS_NULL=0
User Load (0.7ms) SELECT * FROM `users`
Rendering user/index
User Columns (3.0ms) SHOW FIELDS FROM `users`
Completed in 69ms (View: 63, DB: 1) | 200 OK [http://192.168.0.111/user]

なぜか[GET]メソッドになっている。。。もうこればっかりやっていて、気が狂いそうになっていた所で、キョンちゃんがやってくれました。

POST /user/create HTTP/1.1 ^M^J
HOST: 192.168.0.111 ^M^J
Content-Type: application/x-wwwform-urlencoded


最後のContent-Typeを指定する文章を書き足すと、POSTが成功するようです。
しかし、
user[name]=hoge&user[message]=hoge

ここは送れないようです。[ ]を変換する必要があるのかな?

0 件のコメント: