>백엔드 개발 >PHP 튜토리얼 >fetch api 라이브러리를 사용하여 요청한 결과를 다시 패키지해 주시겠습니까?

fetch api 라이브러리를 사용하여 요청한 결과를 다시 패키지해 주시겠습니까?

WBOY
WBOY원래의
2016-10-11 14:23:441272검색

안녕하세요 여러분, 저는 이 라이브러리 https://github.com/dvajs/dva/를 사용합니다... yii2의 나머지 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>

데이터 개체에 목록(원래 반환 결과), x-pagination-total-count, x-pagination-page-count 및 기타 서버 헤더 정보가 포함되도록 반환된 데이터를 다시 패키징하기를 바랍니다

하지만 이제 순수한 REST 반환 결과가 배열이라는 것만 알 수 있습니다. 요청 클래스에서 데이터를 다시 캡슐화하려고 시도했지만 모든 시도가 실패했습니다. 가능한 잘못된 키워드를 찾았습니다.

필요한 물건으로 어떻게 포장할 수 있는지 알려주세요!!!

요청 코드는 다음과 같습니다.

<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>

요청 클래스는 다음과 같습니다.

<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의 나머지 컨트롤러는 다음과 같습니다.

<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의 나머지 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>

데이터 개체에 목록(원래 반환 결과), x-pagination-total-count, x-pagination-page-count 및 기타 서버 헤더 정보가 포함되도록 반환된 데이터를 다시 패키징하기를 바랍니다

하지만 이제 순수 REST 반환 결과가 배열이라는 것만 알 수 있습니다. 요청 클래스에서 데이터를 다시 캡슐화하려고 시도했지만 모든 시도가 실패했습니다. 가능한 잘못된 키워드를 찾았습니다.

필요한 물건으로 어떻게 포장할 수 있는지 알려주세요!!!

요청 코드는 다음과 같습니다.

<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>

요청 클래스는 다음과 같습니다.

<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의 나머지 컨트롤러는 다음과 같습니다.

<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>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.