【问题标题】:POST from Angular to Laravel not working从 Angular 到 Laravel 的 POST 不起作用
【发布时间】: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


【解决方案1】:

我使用 Telerik fiddler : http://www.telerik.com/fiddler 来达到这个目的。它提供以下信息。

  1. 请求详细信息,例如数据、方法、请求标头、身份验证标头、cookie 等。
  2. 响应详细信息、数据、标头

它还允许我们通过修改方法和数据来重放给定的请求,以检查服务在不同输入下的行为。

希望对你有帮助。

此外, 我认为即使您像以下那样更改数据格式,它也应该可以工作。

               data = {
                        summary: "asdf",
                        details: "asdf",
                        start_date: "2014-01-01",
                        end_date: "2014-01-02"  
                };

【讨论】:

  • 这对我没有用,尽管我可以看到你在做什么。然而,我只是确认发送类似 url 的字符串,如:summary=asdf&details=asdf&start_date=Jan+1+2014&end_date=Jan+2+2014 就像一个魅力。
  • 我不确定,但请您尝试一次,输入::post('summary') // 用于 $_POST 而不是 Request::get('summary')
  • Input::post('summary') 抱怨,这是 Laravel 的回复:{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Call to undefined method Illuminate\\Http\\Request::post()","file":"\/vagrant\/laravel\/vendor\/laravel\/framework\/src\/Illuminate\/Support\/Facades\/Facade.php","line":208}}
  • 我刚刚在 Laravel 的 post store() 方法中尝试了这个,它成功返回:$goal = new Goal; $goal->summary = Input::json()->get('summary'); return $goal; 我可能可以从那里得到我需要的东西。
  • 啊!我只是指发布到 API 的值。
猜你喜欢
  • 2021-04-17
  • 2018-03-24
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多