URL vị trí không chính xác được trả về bởi V2 SOAP WSDL


7

Khi tìm nạp WSDL V2 qua URL này:

www.example.com/shop/api/v2_soap?wsdl=1

Đó là xác định URL sai cho các yêu cầu:

<service name="MagentoService">
  <port name="Mage_Api_Model_Server_V2_HandlerPort" binding="typens:Mage_Api_Model_Server_V2_HandlerBinding">
    <soap:address location="http://example.com/shop/index.php/?type=v2_soap"/>
  </port>
</service>

Như bạn có thể thấy ở trên, nó đang trả về URL này:

www.example.com/shop/index.php/?type=v2_soap

Mặc dù nó phải là:

www.example.com/shop/index.php/api/v2_soap/index/

Tôi đã tìm hiểu rất nhiều mã lõi Magento và tôi tin rằng giá trị đó được đặt trong /app/code/core/Mage/Api/Model/Wsdl/Config/Base.php xung quanh dòng 53:

    // set up default WSDL template variables
    $this->_wsdlVariables = new Varien_Object(
        array(
            'name' => 'Magento',
            'url'  => htmlspecialchars(Mage::getUrl('*/*/*', array('_query' => $queryParams)))
        )
    );

Phần này là những gì dường như là thất bại:

Mage::getUrl('*/*/*' ...

Nếu tôi thay đổi điều đó thành:

Mage::getUrl('api/v2_soap/index' ...

URL chính xác được trả lại.

Câu hỏi này dường như được mô tả chính xác cùng một vấn đề, nhưng không bao giờ có câu trả lời cho nó:

Cảm ơn trước sự giúp đỡ nào!

CẬP NHẬT

Mặc dù tôi chưa tìm được giải pháp lâu dài cho vấn đề này, tôi đã tìm thấy giải pháp tạm thời sau khi tìm kiếm xung quanh một chút. Về cơ bản, tôi mở rộng lớp SoapClient và ghi đè phương thức __doRequest như một phương tiện chặn các yêu cầu và điều chỉnh URL vị trí trước khi yêu cầu được gửi:

class SoapClientLocation extends \SoapClient
{
    public function __doRequest( $req, $location, $action, $version = SOAP_1_1, $one_way = NULL )
    {
        $location = str_replace( '?type=v2_soap', 'api/v2_soap/index/', $location, $one_way );
        return parent::__doRequest( $req, $location, $action, $version );
    }
}

 $this->client = new SoapClientLocation( $this->config['api']['url'] );

Hệ thống -> cấu hình -> Web -> Tùy chọn Url -> Tự động chuyển hướng đến URL cơ sở. Đặt nó thành 'Không'
B00mer

Tôi đã thử điều đó một vài lần khác nhau và nó dường như không có hiệu quả.
dự đoán

Câu trả lời:


2

Nó có thể là hai vấn đề:

  1. Sử dụng www.example.com/shop/index.php/api/v2_soap/?wsdlthay vì www.example.com/shop/api/v2_soap?wsdl=1(lưu ý thêm index.php)
  2. Hãy chắc chắn rằng bạn đã vô hiệu hóa error_reporting/ display_errorstrong của bạn index.php.

Lưu ý dài về điểm cuối cùng: SoapClientKhông phải là trình duyệt và do đó không gửi cookie, Magento lần lượt thích cookie và do đó Magento đưa ra một Thông báo (khi bật chế độ báo lỗi), thông báo làm cho XML của bạn không hợp lệ / thậm chí không làm cho nó tải ( SOAP-ERROR: Parsing WSDL: Couldn't find <definitions>)


Tôi đã thử thêm index.php / vào URL và nó không xuất hiện để trợ giúp. Tôi sẽ cố gắng xem xét báo cáo lỗi. Cảm ơn vì tiền hỗ trợ!
dự đoán

0

Vấn đề là

Mage_Api_Controller_Action::preDispatch()

Đặt cửa hàng hiện tại thành 'quản trị viên' (thêm thông tin trong bài đăng trên blog của Alan http://alanstorm.com/magento_api_adapater_xml_rpc )

Nếu bạn đã đặt 'Tự động chuyển hướng đến URL cơ sở', thì API sẽ không thể truy cập được.

Giải pháp của tôi là lắng nghe

controller_front_init_before

Và không có nút cấu hình đó nếu URI chứa 'api'. I E

public function controllerFrontInitBefore($observer) {
    if (stristr(Mage::app()->getRequest()->getRequestUri(), 'api')) {
        Mage::getConfig()->setNode('stores/' . Mage::app()->getStore()->getCode() . '/web/url/redirect_to_base', 0);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.