2017-08-30 9 views
0

スリムなアプリで問題が発生しました.Jsonレスポンスをカスタムヘッダーで送信します。Slim 3のレスポンスオブジェクトを外部クラス経由で変更する

のindex.php

require 'vendor/autoload.php'; 
require 'app/config.php'; 
require 'app/libs/api.cs.php'; 

$app = new Slim\App( 
    [ 
     "settings" => $config, 
     "apics" => function() { return new APIHelper(); } //This is a class that contain a "helper" for api responses 
    ] 
); 

require 'app/dependences.php'; 
require 'app/middleware.php'; 
require 'app/loader.php'; 
require 'app/routes.php'; 

// Run app 
$app->run(); 

アプリ/ libsに/ api.cs.php( "ヘルパー")

<?php 
class APIHelper 
{ 
    public function sendResponse($response, $status='success' ,$code = 200, $message = "", $data = null) 
    { 
     $arrResponse = array(); 
     $arrResponse['status'] = $status; 
     $arrResponse['code'] = $code; 
     $arrResponse['message'] = $message; 
     $arrResponse['data'] = $data; 
     return $response 
     ->withHeader('Access-Control-Allow-Origin', '*') 
     ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization, AeroTkn') 
     ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') 
     ->withHeader('Content-Type','application/json') 
     ->withHeader('X-Powered-By','My API Server') 
     ->withJson($arrResponse,$code); 
    } 
} 

私のroutesファイル(アプリ/ルート:私のコードは次のようなものです。 PHP)

$app->group('/foo', function() { 
    $this->get('', function ($req, $res, $args) { 
    return $this->apics->sendResponse($res, 'success' ,200, "Foo API Index By Get", null); 
}); 

    $this->post('', function ($req, $res, $args) { 
    try{ 
     $oBody = $req->getParsedBody(); 
     return $this->apics->sendResponse($res, 'success' ,200, "Foo API POST Response", $oBody);   
     } 
     catch(\Exception $ex){ 
     return $this->apics->sendResponse($res, 'error' ,500, "Process Error", array('error' => $ex->getMessage())); 
    } 
    }); 
}); 

私がリクエストボディで私のアプリを実行しようとすると、結果は以下である: ヘッダ:

connection →Keep-Alive 
content-type →text/html 
date →Wed, 30 Aug 2017 02:22:56 GMT 
keep-alive →timeout=2, max=500 
server →Apache 
transfer-encoding →chunked 

ボディ(単純なテキストではなく、JSONエンコードされたとして戻っ)

{"status":"success","code":200,"message":"Foo API POST Response","data":{"one":"1", "two":"2"}} 

私はミドルウェアとして、このクラスを置くしようとしましたが、私はこれらの対象にいくつかの混乱しています。

これらの方法が良いか悪いのかを教えてもらえますか?

ありがとうございました。私はあなたの答えをお祈りします!ミドルウェアを使用してニース日

+0

「リクエストボディでアプリを実行しようとしているとき」と言うとどういう意味ですか?あなたのコードは私のマシンで正常に動作します。 – Nima

+0

こんにちは@Nima。 申し訳ありませんが、私はその部分をうまく書きませんでした。アプリケーションに任意のメソッドを呼び出すと、上記の例では、要求の本文にデータを送信するいわゆるポストを使用しました。 –

答えて

0

はちょうど私が笑、私はダウンロードをした「エラー」が幼稚園問題でした

$app->add(function ($req, $res, $next) { 
     $response = $next($req, $res); 
     return $response 
     ->withHeader('Access-Control-Allow-Origin', 'http://mysite') 
     ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization') 
     ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); 
     ->withHeader('Content-Type','application/json'); 
     ->withHeader('X-Powered-By','My API Server'); 
    }); 
+0

こんにちは@Ramy hakam。コメントありがとう!、よ、知ってる?あなたが言ったように、私は同じソリューションを試しましたが、jsonスキームの準備を除いて、私はコードを分けて、ミドルウェアとjsonにヘッダーのカスタマイズを入れました。私はそれをサービスに残しています。しかしカスタムレスポンスヘッダーはまだ表示されず、 "転送エンコーディング"の値も "チャンク"になっています。 –

0

あなたmiddelewareファイルでこの機能を追加するには、問題のための理想的な答えでありますすべての私のコードは、私のマシンでテスト用のWebサーバーから、私は同じ結果を持っていますが、私はすべての私のファイルが奇妙な文字を持っていることがわかったので、私はutf - 8としてファイルを再保存し、問題が解決されます。頭痛を引き起こすことができる少しの詳細! NicaとRamyに感謝します。 Ramy:ソリューションは優れていましたが、コードはより組織化されています。全てにおいて良い日。

関連する問題