code

컨트롤러에서 JSON 렌더링

starcafe 2023. 2. 16. 21:57
반응형

컨트롤러에서 JSON 렌더링

책을 읽고 있었는데 컨트롤러에 관한 장에서 렌더링에 대해 언급하고 있는데, JSON의 경우 다음과 같은 예가 있지만 자세한 내용은 설명하지 않았기 때문에 이 예가 더 큰 그림을 그릴 수 없었습니다.

render :json => @projects, :include => tasks

또한 콜백 함수와 함께 사용하는 JSONP의 예를 다음에 나타냅니다.

render :json => @record, :callback => 'updateRecordDisplay'

누가 설명 좀 해줄래?

일반적으로 JSON을 반환하는 이유는 다음과 같습니다.

A) 어플리케이션의 일부 또는 전부를 단일 페이지 어플리케이션(SPA)으로 빌드하고 있으며 페이지를 완전히 새로고침하지 않고 추가 데이터를 가져올 수 있도록 클라이언트 측 JavaScript가 필요합니다.

또는

B) 서드파티가 사용하는 API를 구축하고 있으며 JSON을 사용하여 데이터를 시리얼화하기로 결정했습니다.

아니면, 아마도, 당신은 자신의 개 사료를 먹고 둘 다 하고 있을 것이다.

어느 경우든render :json => some_dataJSON은 제공된 데이터를 확인합니다.:callback두 번째 예의 키는 좀 더 설명이 필요하지만(아래 참조), 동일한 아이디어의 또 다른 변형입니다(JavaScript가 쉽게 처리할 수 있는 방식으로 데이터를 되돌립니다).

왜죠:callback?

JSONP(두 번째 예)는 모든 브라우저에 내장된 보안의 일부인 동일한 오리진 정책을 회피하는 방법입니다.API가 있는 경우:api.yoursite.com그리고 당신은 당신의 지원서를 다음 날짜로 보내게 될 것입니다.services.yoursite.comJavaScript는 (기본값으로) 할 수 없습니다.XMLHttpRequest(XHR - aka ajax)로부터의 요구services로.api이 제한을 회피하는 방법(원래 자원 공유 사양이 확정되기 전)은 JSON이 아닌 JavaScript인 것처럼 서버에서JSON 데이터를 전송하는 것입니다.따라서, 다음의 내용을 반송하는 것이 아니라,

{"name": "John", "age": 45}

서버는 대신 다음과 같이 회신합니다.

valueOfCallbackHere({"name": "John", "age": 45})

따라서 클라이언트 측 JS 어플리케이션으로 인해script가리키는 태그api.yoursite.com/your/endpoint?name=John또,valueOfCallbackHere함수(클라이언트측 JS에서 정의해야 함)는 이 다른 발신기지에서 데이터를 사용하여 호출됩니다.

정확히 무엇을 알고 싶으세요?Active Record에는 레코드를 JSON으로 시리얼화하는 메서드가 있습니다.예를 들어 레일 콘솔을 열고ModelName.all.to_jsonJSON 출력이 표시됩니다. render :json본질적으로 전화하다to_json는 올바른 헤더를 가진 브라우저로 결과를 반환합니다.이것은 JavaScript에서 사용할 JavaScript 개체를 반환하는 AJAX 호출에 유용합니다.또, 를 사용할 수 있습니다.callback옵션을 사용하여 JSONP를 통해 호출할 콜백의 이름을 지정합니다.

를 들어, 우리가 , 하다, 하다,User:{name: 'Max', email:' m@m.com'}

다음과 같은 컨트롤러도 있습니다.

class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
        render json: @user
    end
end

여기서 jQuery를 사용하여 AJAX 콜을 실행하면 다음과 같이 됩니다.

$.ajax({
    type: "GET",
    url: "/users/5",
    dataType: "json",
    success: function(data){
        alert(data.name) // Will alert Max
    }        
});

보시다시피 id가 5인 사용자를 rails 앱에서 가져와 자바스크립트 코드로 사용할 수 있었습니다.이는 JSON 오브젝트로 반환되었기 때문입니다.콜백 옵션은 JSON 개체와 함께 전달된 이름의 JavaScript 함수를 첫 번째 유일한 인수로서 호출합니다.

, 「 」의 예를 나타냅니다.callback이치노

class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
        render json: @user, callback: "testFunction"
    end
end

이제 다음과 같이 JSONP 요청을 작성할 수 있습니다.

function testFunction(data) {
    alert(data.name); // Will alert Max
};

var script = document.createElement("script");
script.src = "/users/5";

document.getElementsByTagName("head")[0].appendChild(script);

이러한 콜백을 사용하는 동기는 일반적으로 크로스 오리진 자원 공유(CORS)를 제한하는 브라우저 보호를 회피하기 위한 것입니다.다만, 보다 안전하고 간단하게 CORS를 회피하는 다른 기술이 존재하기 때문에, JSONP는 그다지 많이 사용되지 않게 되었습니다.

의 예로서

render :json => @projects, :include => :tasks

''는.@projects JSON, JSON의 합니다.tasks이치노

의 예로서

render :json => @projects, :callback => 'updateRecordDisplay'

''는.@projectsJSON의 javascript.

updateRecordDisplay({'projects' => []})

이를 통해 데이터를 상위 창으로 전송하고 사이트 간 위조 문제를 우회할 수 있습니다.

언급URL : https://stackoverflow.com/questions/14824551/rendering-json-in-controller

반응형