문제

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));

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top