請問使用fetch api庫請求 的結果重新包裝一下?

WBOY
發布: 2016-10-11 14:23:44
原創
1251 人瀏覽過

大家好, 我使用這個庫https://github.com/dvajs/dva/...請求yii2的rest api時, 如何才能將伺服器傳回的頭部x-pagination-page-count, x-pagination -total-count等資訊包裝進返回結果呢?

當前api 回傳訊息的頭部已包含下列資訊

<code>x-pagination-current-page:1
x-pagination-page-count:35
x-pagination-per-page:12
x-pagination-total-count:411</code>
登入後複製
登入後複製

我希望將回傳的data重新包裝下,使data物件包含list(原來的回傳結果), 伺服器頭資訊的x-pagination-total-count,x-pagination-page-count.等資訊

但是現在 我只能獲取到, 純粹的rest返回結果 是個數組. 我嘗試在 request類中重新封裝數據, 各種嘗試都失敗了. 各種搜 可能是關鍵詞不對 也沒有找到解決辦法.

請問各位大神, 如何 才能包裝成我需要的 對象呢? 謝謝!!!

請求代碼如下:

<code> const {data} = yield call(query, parse(payload));
      if (data) {
        console.log(data); //!!!这里!!!  我希望将这里返回的data 重新包装下,使data对象list, 服务器头信息,x-pagination-total-count,x-pagination-page-count.等信息 
        // 但是现在 我只能获取到, 纯粹的rest返回结果 是个数组. 我尝试在 request类中重新封装数据, 各种尝试都失败了. 各种搜  可能是关键词不对  也没有找到解决办法. 
        yield put({
          type: 'querySuccess',
          payload: {
            list: data.list,
            total: Number(data.total),
            current: Number(data.current),
            pageSize: data.pageSize ? data.pageSize : 12,
          }
        });
      }</code>
登入後複製
登入後複製

非同步方法如下:

<code>export async function query(params) {
  return request(`/api/users?${qs.stringify(params)}`);
}</code>
登入後複製
登入後複製

request類別 如下:

<code>import fetch from 'dva/fetch';

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    //这里是可以读取到这些信息的. 但是我不会重新包装. 
    console.log(response.headers.get('x-pagination-page-count')); //35
    console.log(response.headers.get('x-pagination-total-count')); //411
    return response;
  }
  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}

function parseJSON(response) {

  return response.json();
}
/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(url, options) {
  return fetch(url, options)
    .then(checkStatus)
    .then(parseJSON)
    .then((data)=>({data}))
    .catch((err) => ({ err }));
}
</code>
登入後複製
登入後複製

yii2 的rest controller 如下:

<code><?php
namespace api\modules\test\controllers;

use yii;
use yii\helpers\ArrayHelper;
class UsersController extends yii\rest\ActiveController
{
    public $modelClass = '\common\models\User';
    public function behaviors() {
        return ArrayHelper::merge(parent::behaviors(), [
            'corsFilter' => [
                'class' => \yii\filters\Cors::className(),
                'cors' => [
                    // restrict access to
                    'Origin' => ['*'],
                    'Access-Control-Request-Method' => ['*'],
                    'Access-Control-Request-Headers' => ['*'],
                    'Access-Control-Allow-Credentials' => true,
                    // Allow OPTIONS caching
                    'Access-Control-Max-Age' => 3600,
                    // Allow the X-Pagination-Current-Page header to be exposed to the browser.
                    'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
                ],
            ],
        ]);
    }

    public function actions()
    {
        $actions = parent::actions();
        // 禁用"delete" 和 "create" 操作
        unset($actions['delete'], $actions['create']);
        return $actions;
    }
}</code>
登入後複製
登入後複製

回覆內容:

大家好, 我使用這個庫https://github.com/dvajs/dva/...請求yii2的rest api時, 如何才能將伺服器傳回的頭部x-pagination-page-count, x-pagination -total-count等資訊包裝進返回結果呢?

當前api 回傳訊息的頭部已包含下列資訊

<code>x-pagination-current-page:1
x-pagination-page-count:35
x-pagination-per-page:12
x-pagination-total-count:411</code>
登入後複製
登入後複製

我希望將回傳的data重新包裝下,使data物件包含list(原來的回傳結果), 伺服器頭資訊的x-pagination-total-count,x-pagination-page-count.等資訊

但是現在 我只能獲取到, 純粹的rest返回結果 是個數組. 我嘗試在 request類中重新封裝數據, 各種嘗試都失敗了. 各種搜 可能是關鍵詞不對 也沒有找到解決辦法.

請問各位大神, 如何 才能包裝成我需要的 對象呢? 謝謝!!!

請求代碼如下:

<code> const {data} = yield call(query, parse(payload));
      if (data) {
        console.log(data); //!!!这里!!!  我希望将这里返回的data 重新包装下,使data对象list, 服务器头信息,x-pagination-total-count,x-pagination-page-count.等信息 
        // 但是现在 我只能获取到, 纯粹的rest返回结果 是个数组. 我尝试在 request类中重新封装数据, 各种尝试都失败了. 各种搜  可能是关键词不对  也没有找到解决办法. 
        yield put({
          type: 'querySuccess',
          payload: {
            list: data.list,
            total: Number(data.total),
            current: Number(data.current),
            pageSize: data.pageSize ? data.pageSize : 12,
          }
        });
      }</code>
登入後複製
登入後複製

非同步方法如下:

<code>export async function query(params) {
  return request(`/api/users?${qs.stringify(params)}`);
}</code>
登入後複製
登入後複製

request類別 如下:

<code>import fetch from 'dva/fetch';

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    //这里是可以读取到这些信息的. 但是我不会重新包装. 
    console.log(response.headers.get('x-pagination-page-count')); //35
    console.log(response.headers.get('x-pagination-total-count')); //411
    return response;
  }
  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}

function parseJSON(response) {

  return response.json();
}
/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(url, options) {
  return fetch(url, options)
    .then(checkStatus)
    .then(parseJSON)
    .then((data)=>({data}))
    .catch((err) => ({ err }));
}
</code>
登入後複製
登入後複製

yii2 的rest controller 如下:

<code><?php
namespace api\modules\test\controllers;

use yii;
use yii\helpers\ArrayHelper;
class UsersController extends yii\rest\ActiveController
{
    public $modelClass = '\common\models\User';
    public function behaviors() {
        return ArrayHelper::merge(parent::behaviors(), [
            'corsFilter' => [
                'class' => \yii\filters\Cors::className(),
                'cors' => [
                    // restrict access to
                    'Origin' => ['*'],
                    'Access-Control-Request-Method' => ['*'],
                    'Access-Control-Request-Headers' => ['*'],
                    'Access-Control-Allow-Credentials' => true,
                    // Allow OPTIONS caching
                    'Access-Control-Max-Age' => 3600,
                    // Allow the X-Pagination-Current-Page header to be exposed to the browser.
                    'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
                ],
            ],
        ]);
    }

    public function actions()
    {
        $actions = parent::actions();
        // 禁用"delete" 和 "create" 操作
        unset($actions['delete'], $actions['create']);
        return $actions;
    }
}</code>
登入後複製
登入後複製
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板