0

我有一个 Web 服务,它接收来自另一台服务器的传入 POST 请求。请求的字段映射到我的 rails 应用程序中称为“消息”的模型。

当我发送 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

并且对象被成功保存。

不幸的是,我从其他 Web 服务收到的 POST 请求不是 json,格式如下:

content=GUESTTEST&time=2012-08-01+10%3A09%3A03&businessNumber=5555&sessionId=5555CHS1343808543654

如何编写自己的路由和方法来处理这些请求,并将它们映射到我的消息模型?

任何提示将不胜感激!

===== 更新:

我已经通过基于控制器中的顶级 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

结尾

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

4

2 回答 2

0

您应该在 params 哈希中找到所有参数。您可以通过在适当的视图中插入它来输出它们来检查:

<%= debug(params) if Rails.env.development? %>

尽管可以将它们直接传递给 update_attributes(或 Message.new,您的代码片段中缺少该行),但我会编写一个自定义方法来清理它们并从 params 哈希初始化新消息。

于 2012-08-08T08:53:56.770 回答
0

respond_to方法只关心创建请求完成时用于响应客户端的格式。因此,在这里,当您发布到 URI.json时,它将以 JSON 格式响应。发布到的相同数据只会/messages创建相同的对象,但会以 HTML(或设置的默认值)响应。

例如,在您的情况下,您收到的 POST 请求采用参数格式,并且与 HTML 元素发出的数据相同form。参数将在params变量中,因为我确信已经存在。

由于路由与格式无关,因此也不应更改。

你可以像这样模拟这个 POST 请求curl

$ curl -d "content=GUESTTEST&time=2012-08-01+10%3A09%3A03&businessNumber=5555&sessionId=5555CHS1343808543654" http://localhost:3000/messages
于 2012-08-08T08:54:39.220 回答