首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后端到后端API请求和响应

后端到后端API请求和响应
EN

Stack Overflow用户
提问于 2021-12-24 01:46:34
回答 3查看 785关注 0票数 0

我有一个在laravel 8上构建的应用程序,它有一个Vue Spa前端,使用Sanctum

我有一个控制器方法,它请求来自另一个Laravel项目(使用它的Sanctum API),因此实质上,Spa请求来自Laravel 1,后者请求来自Laravel 2项目。

在L2项目返回的响应之后,L2上的Controller方法是:

代码语言:javascript
复制
 public function popular(Request $request)
 {
    $limit = 20;
    if ($request->has('limit')) {
        $limit = $request->limit;
    }

    $perPage = 20;
    if ($request->has('per_page')) {
        $limit = $request->per_page;
    }

    if ($request->has('page')) {

        $articles = $request
            ->user()
            ->articles()
            ->activeArticles()
            ->select('articles.uuid', 'articles.title')
            ->orderBy('articles.views', 'DESC')
            ->simplePaginate($perPage);

    } else {

        $articles = $request
            ->user()
            ->articles()
            ->activeArticles()
            ->select('articles.uuid', 'articles.title')
            ->orderBy('articles.views', 'DESC')
            ->limit($limit)
            ->get();
    }

    return $articles;
}

此响应由L1 Controller方法接收,并发送回Spa,如下所示:

代码语言:javascript
复制
public function popular(Request $request)
{
    $apiEndPoint = self::$apiBaseUrl . '/article/popular';

    $response = self::$httpRequest->get($apiEndPoint, $request->query());

    if (!$response->successful()) {
        return $this->setMessage(trans('help.api_error'))->send();
    }

    $body = $response->getBody();

    return response(['data' => $body]);
}

带着这份回报:

代码语言:javascript
复制
    return response(['data' => $body]);

我获取并空数据对象:

代码语言:javascript
复制
{
    data: {}
}

有了这个回报:

代码语言:javascript
复制
   return response($body);

我以文本/字符串的形式获得有效负载:

代码语言:javascript
复制
[{"id":15,"uuid":"c6082143-0f34-443b-9447-3fa57ed73f48","name":"dashboard","icon":"database","active":1,"owned_by":2,"product_id":4,"created_at":"2021-12-23T11:46:35.000000Z","updated_at":"2021-12-23T11:46:35.000000Z"},{"id":16,

如何将$body作为JSON返回到Spa?

更新:我尝试了下面的建议,但结果仍然是例外。

代码语言:javascript
复制
return response()->json($body);

返回:

代码语言:javascript
复制
"message": "json_decode(): Argument #1 ($json) must be of type string, GuzzleHttp\\Psr7\\Stream given",

因此,在getBody()中获取身体将返回我所理解的字符串。

如果我记录$body,我得到:

代码语言:javascript
复制
$body = $response->getBody();
Log::info($body);

[2021-12-25 23:15:36] local.INFO: {"current_page":2,"data":[{"uuid":"aa4a47bf-4975-4e78-868a-103398934504","title":"Ritchie-Hoeger"},

谢谢大家的帮助和节日的快乐。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-18 05:41:56

API响应器

首先,在“app\Traits\ApiResponser.php”中用laravel创建一个特性

代码语言:javascript
复制
<?php

namespace App\Traits;
use Carbon\Carbon;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;

trait ApiResponser{

    public function  set_response($data, $status_code, $status, $details)
    {
        $resData = response(json_encode(
                [
                    'status'        =>  $status, // true or false
                    'code'          =>  $status_code,
                    'data'          =>  $data,
                    'message'       =>  $details
                ]
        ), 200)
        ->header('Content-Type', 'application/json');

        $data = [];

        return $resData;
    }

}

第二,在任何控制器中调用此特性的函数set_response()

代码语言:javascript
复制
<?php
namespace App\Http\Controllers;

use App\Models\User;
use App\Traits\ApiResponser;
use Illuminate\Http\Request;

class ListController extends Controller
{
    use ApiResponser;


    public function getAllUserList(Request $request)
    {
        $data = User::select('id', 'name', 'email')->get();
        return $this->set_response(['data' => $data], 200,'success', ['User list']);
    }


}

输出将是这样的

票数 1
EN

Stack Overflow用户

发布于 2021-12-24 08:42:49

使用json助手函数

代码语言:javascript
复制
    return response()->json($body);
代码语言:javascript
复制
or
代码语言:javascript
复制
    use Response;
    
    return Response::json($body);

这将创建一个\Illuminate\Routing\ResponseFactory实例。以下可能的参数请参见phpDocs:

代码语言:javascript
复制
/**
* Return a new JSON response from the application.
*
* @param string|array $data
* @param int $status
* @param array $headers
* @param int $options
* @return \Symfony\Component\HttpFoundation\Response 
* @static 
*/
public static function json($data = array(), $status = 200, $headers = array(), $options = 0){
   
    return \Illuminate\Routing\ResponseFactory::json($data, $status, $headers, $options);
}
票数 0
EN

Stack Overflow用户

发布于 2021-12-25 23:21:19

我需要->getContents()->getBody()之后

代码语言:javascript
复制
$body = $response->getBody()->getContents();

一切又好了..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70468882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档