我有一个Web服务,它接收来自另一台服务器的传入POST请求。请求的字段映射到我的rails应用程序中的模型,名为“message”。
当我发送像
这样的JSON POST时curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d
'{"message":{"content":"GUESTTEST","time":"2012-08-01 10:30:99","businessNumber":"5555","sessionId":"5555CHS1343808543654"}}'
http://localhost:3000/messages.json
请求由块处理:
respond_to do |format|
if @message.save
format.html { redirect_to @message, notice: 'Message was successfully created.' }
format.json { render json: @message, status: :created, location: @message }
end
该对象已成功保存。
不幸的是,我从其他网络服务收到的POST请求是非json,并采用以下格式:
content=GUESTTEST&time=2012-08-01+10%3A09%3A03&businessNumber=5555&sessionId=5555CHS1343808543654
如何编写自己的路线和方法来处理这些请求,并将它们映射到我的消息模型?
任何tipps都将非常感激!
===== 更新:
我通过在控制器中创建基于顶级params元素的对象来解决这个问题,如下所示:
def create
@message = Message.new(content: params[:content], command: params[:command], messageId: params[:messageId], msisdn: params[:msisdn], businessNumber: params[:businessNumber], keyword: params[:keyword], operatorCode: params[:operatorCode], sessionId: params[:sessionId], time: params[:time])
respond_to do |format|
if @message.save
format.html { redirect_to @message, notice: 'Message was successfully created.' }
format.json { render json: @message, status: :created, location: @message }
else
format.html { render action: "new" }
format.json { render json: @message.errors, status: :unprocessable_entity }
end
end
端
实现这一目标的更优雅的方法是什么?
答案 0 :(得分:0)
您应该在params哈希中找到所有参数。您可以通过在适当的视图中插入它来输出它们来检查:
<%= debug(params) if Rails.env.development? %>
尽管可以将它们直接传递给update_attributes,(或者Message.new,代码片段中缺少该行),我会编写一个自定义方法来清理它们并从params哈希中初始化新的Message。 / p>
答案 1 :(得分:0)
respond_to
方法仅关注在创建请求完成时用于响应到客户端的格式。所以在这里,当您发布到URI .json
时,它将以JSON格式响应。仅发布到/messages
的相同数据将创建相同的对象,但会以HTML(或默认设置)进行响应。
在您的情况下,您收到的POST请求是参数格式,并且与HTML form
元素发出的数据相同。参数将在params
变量中,我确定已经存在。
由于路线与格式无关,因此也不应改变。
您可以使用curl
模拟此POST请求,如下所示:
$ curl -d "content=GUESTTEST&time=2012-08-01+10%3A09%3A03&businessNumber=5555&sessionId=5555CHS1343808543654" http://localhost:3000/messages