3

私のCodeigniterファイルには

$CI->output->set_header("Access-Control-Allow-Origin: *");
$CI->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin");
$CI->output->set_status_header(200);
$CI->output->set_content_type('application/json');
echo json_encode(array("city" => "dhaka"));

しかし、私が得るhttp応答は次のとおりです。

Request URL:http://localhost/index.php/location/city
Request Method:POST
Status Code:200 OK

Connection:Keep-Alive
Content-Length:16
Content-Type:text/html
Date:Sun, 22 Jul 2012 10:27:32 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r DAV/2 PHP/5.3.6
X-Powered-By:PHP/5.3.6

Access-Control-Allow-Originを含めた後でも、応答にヘッダーがありませんAccess-Control-Expose-Headers: Access-Control-Allow-Origin。このヘッダーに関する私の情報源は、MozillaDeveloperWebサイトからです。

4

4 に答える 4

5

header()結局のところ、codeigniter構文ではなくPHP構文を使用してヘッダーを設定した場合にのみ機能しました$CI->output->set_header()。それは悲しいことだ。

このトピックの質問での@Yanによる最初のコメントに感謝します

于 2012-11-24T02:03:55.837 に答える
3

よく見ると、コンテンツタイプが異なっていることに気付くでしょう。text/htmlそれは、あなたが要求しているのに対してですapplication/json。これは、ヘッダーを正しく準備しているときに、実際にヘッダーを出力することがないために発生します。私の知る限り、これは少なくとも2つの方法で実行できます。

  1. 出力ライブラリのset_output関数を使用して、すべてを一度に出力します。

    $json = json_encode(array("city" => "dhaka"));
    
    $this->output->set_header("Access-Control-Allow-Origin: *");
    $this->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin");
    $this->output->set_status_header(200);
    $this->output->set_content_type('application/json');
    
    $this->output->set_output($json);
    
  2. output-libraryの_display()関数を呼び出して、最初に正しいヘッダーを出力してから、jsonオブジェクトにechoを追加します。

    $this->output->set_header("Access-Control-Allow-Origin: *");
    $this->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin");
    $this->output->set_status_header(200);
    $this->output->set_content_type('application/json');
    $this->output->_display();
    
    echo json_encode(array("city" => "dhaka"));
    

    この関数は、最終的な出力データをサーバーヘッダーおよびプロファイルデータとともにブラウザーに送信します。(CI / system / core / Output.phpの316行目から)

于 2012-11-21T20:47:18.730 に答える
0

少し調べてみたところ、エラーや例外がない場合は、$ CI-> output-> set_header()が機能することがわかりました。

CIがキャッチできるエラーまたは例外がある場合、出力クラスとビュークラスは完全にバイパスされ、適切なエラーページがレンダリングされinclude(VIEWPATH.'errors/'.$template.'.php')、ヘッダーがset_status_header($status_code)(にある<CI System Dir>/core/Common.php)で送信されます。

見る<CI System Dir>/core/Exceptions.php

ここにサンプルがあります:

    /**
     * General Error Page
     *
     * Takes an error message as input (either as a string or an array)
     * and displays it using the specified template.
     *
     * @param   string      $heading    Page heading
     * @param   string|string[] $message    Error message
     * @param   string      $template   Template name
     * @param   int     $status_code    (default: 500)
     *
     * @return  string  Error page output
     */
    public function show_error($heading, $message, $template = 'error_general', $status_code = 500)
    {
        set_status_header($status_code);

        $message = '<p>'.implode('</p><p>', is_array($message) ? $message : array($message)).'</p>';

        if (ob_get_level() > $this->ob_level + 1)
        {
            ob_end_flush();
        }
        ob_start();
        include(VIEWPATH.'errors/'.$template.'.php');
        $buffer = ob_get_contents();
        ob_end_clean();
        return $buffer;
    }

DRYが簡単ではなくなるという点で面倒です。これを回避するには、たとえば(テストされていない)ヘルパー関数を作成することをお勧めします。

function my_generate_headers($headers=array(),$useOutputClass=true)
{
    if(is_array($headers) && count($headers)<1) return false;

    foreach($headers AS $eHeader)
    {
        ($useOutputClass) ? 
                    get_instance()->output->set_header('X-Powered-By: C-C-C-Cocaine') : 
                    @header('X-Powered-By: Errors',true);
    }

    return true;
}

この関数は、コントローラーだけでなく、さまざまなエラーページでも使用でき<CI Views>/errors/error_*.phpます。

于 2013-02-14T09:52:45.020 に答える
0

私のために働いたのは:

$this->output
  ->set_header('Access-Control-Allow-Origin: http://localhost:4567')
  ->set_header('Content-type: application/json')
  ->set_status_header(200)
  ->set_output( json_encode($to_encode) )
  ->_display();
于 2016-07-26T18:18:15.177 に答える