Rails:如何以非json /自定义格式处理传入的POST请求?

时间:2012-08-08 08:37:32

标签: ruby-on-rails json http-post

我有一个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

实现这一目标的更优雅的方法是什么?

2 个答案:

答案 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