2014-09-16 4 views
3

API를 제공하기 위해 REST 서버와 함께 Drupal 서비스를 사용하고 있습니다.
이전에는 1 유형의 응답, JSON 만 사용 했으므로 URL에 ".json"이라는 추가 확장자가 필요하지 않았습니다.Drupal 서비스의 기본 응답 형식을 JSON으로 변경하는 방법은 무엇입니까?

이제 새로운 형식 지정 프로그램 인 XML을 추가해야합니다.
그런 다음 문제가 시작되고 확장명이없는 모든 API (.json 또는 .xml)가 XML에 기본 출력으로 설정됩니다.

나는이 문제를 추적하려고하고 마침내 관련 변수가 'rest_server_default_response_format'이라는 것을 발견했다.
서비스 모듈에 관련된 코드 getResponseFormatContentTypeNegotiations

그래서 $ 한 mime_candidates이 [η] =

Array ([0] => application/xml [1] => text/xml [2] => application/json) 

심지어 response_format 이미 라인 87 에 JSON으로 설정

하지만이다 mimeparse-> best_match() return 'text/xml'.

이것을 대체하는 가장 좋은 방법은 무엇입니까?
getResponseFormatContentTypeNegotiations를 편집하는 것이 가장 좋은 방법이라고 생각하지 않습니다.
어쨌든 best_match 함수가 XML보다 형식 JSON을 선호합니까?

감사합니다. 가능한 JSON이 XML 대신 응답으로 사용되는 경우

Accept: application/json 

:

답변

0

가장 좋은 방법은 사용 귀하의 요청에 헤더를 "허용"하는 것입니다.

1

관리자 UI를 통해 구성된 서비스 만 수정하여 특정 형식 만 반환하도록 할 수 있습니다.

구조> 서비스

다음 자원을 편집> 서버 탭

는 당신은 응답 형식을 선택하고 독점적으로 JSON 만들 수 있습니다.

1

서비스의 최신 버전에서는 모든 조치가 services/servers/rest_server/includes/ServicesContentTypeNegotiator.inc 파일의 getResponseFormatContentTypeNegotiations()에서 발생합니다. 구체적으로이 부분은

// Get the best matching format, default to json 
$response_format = variable_get('rest_server_default_response_format', 'json'); 
$http_accept = $context->getServerVariable('HTTP_ACCEPT'); 
if (!empty($http_accept)) { 
    $mime = $this->mimeParse(); 
    $mime_type = $mime->best_match($mime_candidates, $http_accept); 
    $response_format = isset($mime_map[$mime_type]) ? $mime_map[$mime_type] : ''; 
} 

기본값은 JSON 형식입니다. 요청의 수락 헤더를보고 있습니다. 수락 헤더가 유효한 MIME 유형을 지정하지 않으면 JSON을 사용하게됩니다.

모든 최신 브라우저는 'content negotiation'이라고하는이 기능이 기본적으로 기본적으로 HTML을 먼저 허용 한 다음 XML을 (브라우저에 따라 다르지만) 지정합니다.

이렇게 생각하면 은 클라이언트가 JSON을 얻기 위해 요청 헤더에서 XML MIME 유형을 제거하기 만하면됩니다. 그리 불행히도.

요청에 'accept'헤더가 포함되어있는 경우 코드는 헤더를 사용하도록 설정 한 파서 목록과 일치 시키려고 시도합니다 (XML, JSON이라고 가정 해 봅시다). 일치 또는 첫 번째따라서 수락 헤더가 있고 유효한 MIME 형식을 지정하지 않은 경우 서비스에서 활성화 된 첫 번째 메시지를 사용합니다.

사용 설정 한 파서의 순서를 변경하려면 services.alter.api.php의 후크 중 하나를 사용할 수 있다고 생각합니다.