Fre*_*rik 3 json elixir phoenix-framework
在菲尼克斯,我有这个模型
schema "events" do
field :start_time, Ecto.DateTime
field :end_time, Ecto.DateTime
belongs_to :calendar, Weozo.Calendar
timestamps
end
@required_fields ~w(calendar_id start_time end_time)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
Run Code Online (Sandbox Code Playgroud)
我有一个由scaffold生成的JSON API控制器(通过:api),其中create函数看起来像这样
def create(conn, %{"event" => event_params}) do
changeset = Event.changeset(%Event{}, event_params)
case Repo.insert(changeset) do
{:ok, event} ->
conn
|> put_status(:created)
|> put_resp_header("location", event_path(conn, :show, event))
|> render("show.json", event: event)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(Weozo.ChangesetView, "error.json", changeset: changeset)
end
end
Run Code Online (Sandbox Code Playgroud)
这只是默认的锅炉板.现在,我想用Javascript客户端创建一个事件,使用jQuery我这样做:
$.post('/api/events',
{"event": {"calendar_id": 1, "start_time": Date.now(), "end_time": Date.now()}}
).always(function(r){console.log(r.responseText)})
Run Code Online (Sandbox Code Playgroud)
它会返回这个
{"errors":{"start_time":["is invalid"],"end_time":["is invalid"]}}
Run Code Online (Sandbox Code Playgroud)
因此,默认情况下,Javascript将日期作为整数(Epoch格式)发布.我已经尝试过curl的一系列变化,如下所示:
只是一个正常的约会
curl -X POST http://localhost:4000/api/events \
-H "Content-Type: application/json" \
-d '{"event": {"calendar_id": 1, "start_time": "2015-10-29", "end_time": "2015-10-29"}}'
Run Code Online (Sandbox Code Playgroud)
RFC 1123格式化日期
curl -X POST http://localhost:4000/api/events \
-H "Content-Type: application/json"
-d '{"event":{"calendar_id":"1","start_time":"Thu, 29 Oct 2015 20:11:54 GMT","end_time":"Thu, 29 Oct 2015 20:11:54 GMT"}}'
Run Code Online (Sandbox Code Playgroud)
ISO 8601格式化日期
curl -X POST http://localhost:4000/api/events \
-H "Content-Type: application/json"
-d '{"event":{"calendar_id":"1","start_time":"2015-10-29T20:12:30+0000","end_time":"2015-10-29T20:12:30+0000"}}'
Run Code Online (Sandbox Code Playgroud)
它们都收到相同的"无效"错误消息.
所以Phoenix不接受Epoch,RFC 1123或ISO 8601.我应该如何设置Phoenix的日期以接受它?
Gaz*_*ler 10
变更集将使用文档中的Ecto.DateTime.cast/1来转换日期时间字段:
•"YYYY-MM-DD HH:MM:DD"格式的二进制文件(可以用T和/或后跟"Z"分隔,如2014-04-17T14:00:00Z)
•"YYYY-MM-DD HH:MM:DD.USEC"格式的二进制文件(可以用T和/或后跟"Z"分隔,如2014-04-17T14:00:00.030Z)
时间应采用ISO8601格式:
2015-10-29T20:12:30Z
Run Code Online (Sandbox Code Playgroud)
您可以在JavaScript中生成这样的字符串:
new Date().toISOString()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1265 次 |
| 最近记录: |