【发布时间】:2014-11-04 15:29:09
【问题描述】:
我一直在研究可以正常工作的 REST API。通过像 Postman 这样的客户端,我可以测试并查看我的更改、删除、添加等工作,只要我使用 x-www-form-urlencoded 对数据进行编码
但是现在我正在尝试将它与 Angular 连接起来。我可以发出 GET 请求,但 POST 让我很头疼。
这是我在 Angular .js 中做脏活的从头指令(我知道我需要为此创建一个服务):
app.directive('addGoal', function($http) {
return {
restrict: 'E',
templateUrl: 'js/templates/add-goal.html',
link: function(scope) {
scope.submit = function(data) {
data = {
goal: {
summary: "asdf",
details: "asdf",
start_date: "2014-01-01",
end_date: "2014-01-02"
}
};
console.log(data);
$http({
url: 'http://localhost:8000/v1/goal/',
method: 'POST',
data: data,
headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}
}).
success(function() {
console.log(data);
}).
error(function() {
console.log('error');
});
};
}
};
});
调用被触发,.success() function 正常运行,但是数据没有在我的 API 中发布,因此没有保存到数据库中。
当我收到回复时,它表现得好像格式不正确,因为它在验证时出错:
{"error":true,"message":{"summary":["The summary field is required."],"details":["The details field is required."],"start_date":["The start date field is required."],"end_date":["The end date field is required."]}}
仅供参考,这里是我在 Laravel 中的控制器的 store() 函数做 API 工作:
public function store()
{
$goal = new Goal;
$goal->summary = Request::get('summary');
$goal->details = Request::get('details');
$goal->user_id = Auth::user()->id;
$start_date_entered = Request::get('start_date');
$end_date_entered = Request::get('end_date');
$goal->start_date = date('Y-m-d', strtotime($start_date_entered));
$goal->end_date = date('Y-m-d', strtotime($end_date_entered));
$validation = Validator::make(Request::all(), [
'summary' => 'required|max:255',
'details' => 'required|max:255',
'start_date' => 'required|date',
'end_date' => 'required|date'
]);
if ($validation->fails())
{
$messages = $validation->messages();
return Response::json(array(
'error' => true,
'message' => $messages),
200
);
}
else
{
$goal->save();
return Response::json(array(
'error' => false,
'goal' => $goal->toArray()),
200
);
}
}
我创建了这样的测试路线:
Route::post('/test', function()
{
// First we fetch the Request instance
$request = Request::instance();
// Now we can get the content from it
$content = $request->getContent();
var_dump($content);
});
令人惊讶的是,我的回复是这样的:
string(94) "{"goal":{"summary":"asdf","details":"asdf","start_date":"2014-01-01","end_date":"2014-01-02"}}"
如果成功函数正在触发,那么它会触发 API,对吗?我该如何解决这个问题以找出真正的问题?我被困在下一步应该去哪里将这些数据导入 API 以便它可以正确存储它,就像它在 REST 客户端中所做的那样。
编辑
经过审查,实际问题涉及我设置 Laravel 的方式,它无法理解 JSON 正在被传入。一个简单的修复涉及将 Request::get 更改为 Input::json()->get():
$goal->summary = Input::json()->get('summary');
【问题讨论】:
-
angular 将在请求正文中以
application/json的形式发送数据,这正是您在 var_dump 中看到的内容。 json_decode 它而不是使用 post 方法 -
事实证明,在某种程度上,您的评论就是答案。 API 上不需要 JSON,我完全不知道。因此,只要我将它提交到像
summary=asdf&details=asdf&start_date=Jan+1+2014&end_date=Jan+2+2014这样的 URL 字符串中,它就会像魅力一样发挥作用。 -
但你只能查询字符串长度,json_decode请求正文要简单得多
-
看来我只需要重写我的 larval 控制器来获取 JSON 并从那里解码。
标签: javascript php angularjs rest laravel