POST에서 사용자 정의 REST API 경로에 대한 응답이 없습니다.
-
12-12-2019 - |
문제
Magento의 REST Api에 대해 작동하는 사용자 지정 경로를 설정했습니다.
GET 요청에 대해서는 잘 작동합니다. _retrieve()
해당 기능 V1.php
클래스가 예상대로 호출되고 데이터를 반환합니다.하지만 이제 POST 요청을 처리하려고 하는데 이때 Magento가 이상하게 행동합니다.
- 데이터를 게시하려면 데이터를 엔터티 대신 컬렉션으로 정의해야 합니다.
etc/api2.xml
이와 같이:<action_type>collection</action_type>
.그렇지 않으면 Magento에서 이 오류가 발생합니다.Mage_Api2_Model_Resource
(라인 207):
// Creation of objects is possible only when working with collection
$this->_critical(self::RESOURCE_METHOD_NOT_IMPLEMENTED);
따라서 action_type을 컬렉션으로 정의하면 _multiCreate()
해당 기능 V1.php
예상대로 호출되고 있습니다.
그러나 이제 Magento에서는 어떤 데이터도 반환할 수 없습니다.이 배열을 JSON 형식으로 반환하고 싶습니다.
$response = array("success"=>true, "error"=>"", "model"=>array(1,2,3));
'성공', '오류' 및 '모델'은 api2.xml에 속성으로 정의되어 있으므로 사용할 수 있어야 합니다.하지만 내가 돌아올 때 $response
, 응답은 상태 207로 비어 있습니다 ...흠!이제 action_type 컬렉션이 있으므로 $response
다른 배열에 포함되었지만 성공하지 못했습니다.
마지막 시험에서 나는 메소드를 사용하여 데이터를 설정함으로써 그것을 알아냈습니다. $this->getResponse()->addMessage(....)
데이터를 검색할 수 있지만 성공/오류/경고 메시지 유형에 대한 것으로 생각되고 내 데이터 유형 요구 사항에 맞지 않기 때문에 이것이 올바른 방법이라고 생각하지 않습니다.
마지막으로 나는 또한 다음을 사용하여 데이터를 반환하려고 시도했습니다. $this->getResponse()->setBody($result)
그리고 $this->getResponse()->setRawBody($result)
방법이지만 다시 성공하지 못했습니다.
Magento 전문가 - REST API에 대한 POST 요청에서 데이터를 검색하는 올바른 방법은 무엇입니까?여러분의 도움이 절실히 필요합니다!!
여기 내 api2.xml
:
<customer_login translate="title" module="Test_Restapi">
<group>restapi</group>
<model>restapi/api2_customer_login</model>
<title>Blablabla</title>
<sort_order>10</sort_order>
<privileges>
<customer>
<create>1</create>
<update>1</update>
<retrieve>1</retrieve>
</customer>
<guest>
<create>1</create>
<update>1</update>
<retrieve>1</retrieve>
</guest>
</privileges>
<attributes>
<success>Success</success>
<error>Error</error>
<model>Model</model>
</attributes>
<routes>
<route_collection>
<route>/restapi/customer/login</route>
<action_type>collection</action_type>
</route_collection>
</routes>
<versions>1</versions>
</customer_login>
해결책
수업을 들어보면 Mage_Api2_Model_Resource
클래스에 의해 확장되어야 하는 기능을 찾을 수 있습니다. _render()
.
검사하여 dispach()
이 클래스의 함수를 보면 알 수 있습니다. _render()
함수는 검색 작업에 의해 호출됩니다.따라서 작업이 끝날 때 이 기능을 사용할 수 있습니다. $this->_render($data)
.
이 기능은 새로 생성된 리소스 URL에 Location 헤더만 설정하는 생성 작업에서는 사용되지 않습니다.
속성 필터링을 활용하려면 다음을 사용하세요. $this->getFilter()->out($data)
~ 전에 $this->_render($data)
Mage_Api2_Model_Resource::dispatch()
magento REST에 관한 많은 질문에 답할 수 있습니다!
다른 팁
나는 에서 데이터를 검색하는 데 성공했습니다. _createMulti()
@raivis.krumins 제안에 따라 작동하세요.내부 dispatch()
의 기능 Mage_Api2_Model_Resource
클래스 끝 부분의 228번 줄 뒤에 이 3줄을 추가했습니다. if
위치 헤더가 설정되는 명령문:
$retrievedData = $this->_createMulti($filteredData);
$returnData = $this->getFilter()->out($retrievedData);
$this->_render($returnData);
첫 번째 줄은 함수에서 결과를 검색하고, 두 번째 줄은 원치 않는 속성(에 설정되지 않은 속성)을 필터링합니다. api2.xml
) 마지막으로 세 번째 줄은 응답으로 데이터를 반환합니다.
이러한 변경은 항상 사용자 정의 모듈에서 수행되어야 합니다.핵심 클래스를 변경하지 마십시오!
사용자 정의 모듈 기능 세트에서 재실행 직전
$this->getResponse()->appendBody(json_encode($response));