HTTP 컨텐츠 유형 헤더 및 JSON


144

나는 항상 알려지지 않은 것에 대한 두려움을 위해 대부분의 HTTP 프로토콜 속성을 사용하지 않으려 고 노력해 왔습니다.

그러나 나는 오늘 두려움에 직면하고 의도적으로 헤더를 사용하기 시작할 것이라고 스스로에게 말했다. json브라우저 로 데이터 를 보내려고 하고 바로 사용하려고했습니다. 예를 들어 준비 상태 4에 Ajax 핸들러 함수가있는 경우 다음과 같습니다.

function ajaxHandler(response){
    alert(response.text);
}

그리고 PHP 코드에서 content-type 헤더를 설정했습니다.

header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));

브라우저에 들어오는 데이터가 명확하다는 메시지가 표시되면 핸들러 함수에서 속성에 직접 액세스 할 수없는 이유는 application/json무엇입니까?


올바르게 이해 text하면 처리기에서 자바 스크립트 변수 로 사용 하고 응답하지 않습니까? 매우 이상한 기능입니다. json_encode는 또한 PHP 배열에서 1 개의 객체를 만듭니다. 따라서 이것을 자바 스크립트로 가져올 때 변수에 할당해야합니다.
Flashin

4
contentType 헤더는 정보 용입니다. 브라우저는 가능한 경우이를 사용하지만,이 경우 브라우저는 일반적으로 의도가 무엇인지 모르기 때문에이를 무시합니다. 자바 스크립트 응용 프로그램에서 사용할 수 있습니다. JSON이 제공된다고 가정하고로 디코딩 할 수 있습니다 JSON.parse(). 잘못된 contentType이 나타나면 다른 조치를 취하거나 오류를 발생시킬 수 있습니다.

1
브라우저는 자동으로 JSON 텍스트를 구문 분석하지 않으므로 response.text여전히 문자열입니다.
nnnnnn

1
헤더를 설정해도 아무런 차이가 없다고 말하십시오. 그때 존재의 목적은 무엇입니까?
php_nub_qq

2
@ php_nub_qq : 응용 프로그램이 적절하게 처리 할 수 ​​있도록 서버가 반환 한 내용을 알려주는 것이 목적입니다. 브라우저 당신을 위해 JSON을 구문 분석 할 것입니다, 당신의 응용 프로그램은 그렇게 할 필요가있다. 이 헤더는 그것이 (또는 JSON이어야 함) 알려줍니다.
로켓 Hazmat

답변:


136

Content-Type헤더는 당신의 응용 프로그램에 대한 정보로 사용된다. 브라우저는 그것이 무엇인지 상관하지 않습니다. 브라우저는 AJAX 호출에서 데이터를 반환합니다. JSON으로 구문 분석하려면 직접 수행해야합니다.

헤더는 앱이 반환 한 데이터와 처리 방법을 감지 할 수 있도록하기위한 것입니다. 헤더를보고 헤더 인 경우 application/jsonJSON으로 구문 분석해야합니다.

이것이 실제로 jQuery의 작동 방식입니다. 결과로 수행 할 작업을 알려주지 않으면를 사용하여 Content-Type수행 할 작업을 감지합니다.


12
그것은 사실이 아닙니다. 까지 header('Content-Type: application/json');다운로드를 사용하지 않으면 강제로 다운로드됩니다 . 이 json 헤더를 사용하면 얻을 수 있습니다. Content-Disposition: attachment; filename=myfile.jsonmyfile.json.htmlmyfile.json
Remi Grumeau

4
@RemiGrumeau '완전히 사실이 아닌'이란 무엇입니까? 브라우저로 파일을 다운로드하는 것은 완전히 다릅니다. 브라우저는 기본적으로 HTML을 예상하므로 아마도 달리 지정하지 않는 한 수신하는 HTML이라고 가정합니다. 다운로드 할 때 .html파일이 기본값으로 설정되므로 파일에 추가 됩니다.
bzeaman

2
여기서 문제의 전체 컨텍스트를 모르겠습니다. 그러나 브라우저 (및 자바 스크립트)는 때때로 Content-Type에 관심이 있습니다. 이 헤더는 브라우저가 컨텐츠를 표시하는 데 사용하는 휴리스틱에 영향을 줄 수 있으며 컨텐츠 유형의 text / html을 사용하여 XML 및 JSON을 전송하면 기본 XHR 요청 (또는 그 위에있는 프레임 워크 계층)에서 미묘한 버그가 발생할 수 있습니다.
Alan Storm

7

Content-Type: application/json컨텐츠 헤더 일뿐입니다. 컨텐츠 헤더는 반환 된 데이터 유형에 대한 정보입니다 (예 : ex :: JSON, image (png, jpg 등), html).

JavaScript의 JSON은 배열 또는 객체입니다. 모든 데이터를 보려면 경고 대신 console.log를 사용하십시오.

alert(response.text); // Will alert "[object Object]" string
console.log(response.text); // Will log all data objects

원래 JSON 컨텐츠를 문자열로 경고하려면 작은 따옴표 ( ')를 추가하십시오.

echo "'" . json_encode(array('text' => 'omrele')) . "'";
// alert(response.text) will alert {"text":"omrele"}

큰 따옴표를 사용하지 마십시오. JSON은 각 값과 키에 큰 따옴표를 사용하기 때문에 JavaScript를 혼동합니다.

echo '<script>var returndata=';
echo '"' . json_encode(array('text' => 'omrele')) . '"';
echo ';</script>';

// It will return the wrong JavaScript code:
<script>var returndata="{"text":"omrele"}";</script>

이 작업을 수행하지 마십시오. 작은 따옴표를 사용하여 모든 문자열에서 끊어집니다 (많은 언어에서 자주 사용됨). echo "'" . json_encode(array('text' => 'it\'s wrong')) . "'"; 이 깨진 출력을 생성합니다 '{"text":"it's wrong"}'. 대신 이것을 사용하십시오 json_encode(json_encode(array('text' => 'it\'s good'))). 결과는 올바르게 탈출 할 것이다 :"{\"text\":\"it's wrong\"}"
PofMagicfingers

1

아래 코드는 프론트 엔드에서 JavaScript 용 JSON 객체를 반환하는 데 도움이됩니다.

내 템플릿 코드

template_file.json

{
    "name": "{{name}}"
}

파이썬 지원 코드

def download_json(request):
    print("Downloading JSON")
    # Response render a template as JSON object
    return HttpResponse(render_to_response("template_file.json",dict(name="Alex Vera")),content_type="application/json")    

url.py 파일

url(r'^download_as_json/$', views.download_json, name='download_json-url')

프론트 엔드 용 jQuery 코드

  $.ajax({
        url:'{% url 'download_json-url' %}'        
    }).done(function(data){
        console.log('json ', data);
        console.log('Name', data.name);
        alert('hello ' + data.name);
    });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.