Cách tạo dịch vụ Web SOAP trong PHP

Gần đây, tôi đã phải tương tác với một số dịch vụ web SOAP và tôi đã nghĩ ra một số kỹ thuật để giúp xây dựng người tiêu dùng dịch vụ web SOAP tốt

Hai mục tiêu quan trọng nhất khi xây dựng ứng dụng tiêu dùng SOAP là để mã có thể bảo trì được và có thể kiểm tra được

khởi đầu đen tối

Cách tiếp cận đầu tiên tự nhiên là viết một lớp xử lý mọi thứ cần thiết để tương tác với dịch vụ web

client = new SoapClient($wsdl, [
            'login' => $this->username,
            'password' => $this->password
        ]);
    }

    public function getBooks()
    {
        $response = $this->client->getBooks();

        // Transform the response as appropriate...

        return $response;
    }
}

Những gì chúng tôi đã viết ở trên rất khó kiểm tra vì chúng tôi đang tự xây dựng

client = $client
    }

    // ..
}
0. Kiểm tra bất kỳ phương pháp nào trên người tiêu dùng có nghĩa là thực hiện cuộc gọi thực sự đến dịch vụ web

Chúng ta có thể làm tốt hơn

client = $client
    }

    // ..
}

Bằng cách yêu cầu người tiêu dùng tuyên bố thẳng thắn những gì nó yêu cầu để hoạt động (một phiên bản của ứng dụng khách), giờ đây chúng tôi có thể xây dựng người tiêu dùng với các phiên bản giả của

client = $client
    }

    // ..
}
0, nơi chúng tôi có thể thực hiện các cuộc gọi thực đến dịch vụ web

Thưởng. người tiêu dùng không còn chịu trách nhiệm xây dựng đối tượng SoapClient với thông tin đăng nhập chính xác. Đó luôn là một dấu hiệu tốt để giảm bớt trách nhiệm của một lớp học

Viết bài kiểm tra

Bây giờ, chúng ta đã có cách đưa ứng dụng khách vào ứng dụng tiêu dùng của mình, hãy sử dụng Mockery để giả mạo cuộc gọi dịch vụ web

shouldReceive('getBooks')
            ->once()
            ->andReturn(simplexml_load_string($this->getXml()))
            ->getMock();

        // Inject our mock SoapClient into the consumer
        // and make the call that we're testing...
        $response = (new Consumer($client))->getBooks();

        // Assert that the response is what we would expect...
        $this->assertEquals([
            [
                'title' => 'The Alchemist',
            ], [
                'title' => 'Veronica Decides To Die',
            ], [
                'title' => 'The Second Machine Age',
            ],
        ], $response);
    }

    private function getXml()
    {
        return <<
    
        
            The Alchemist
        
        
            Veronica Decides To Die
        
        
            The Second Machine Age
        
    

XML;
    }
}

Vì PHP's

client = $client
    }

    // ..
}
0 trả về một đối tượng
client = $client
    }

    // ..
}
3  từ một lệnh gọi phương thức dịch vụ web, nên đó là những gì chúng ta sẽ có đối tượng giả của mình trả về – ngoại trừ việc chúng ta sẽ sử dụng đoạn mã XML được xác định trước để kiểm soát môi trường thử nghiệm của mình

Giờ đây, chúng tôi có thể tự do kiểm tra phản hồi khi chúng tôi thấy phù hợp

Tránh lớp người tiêu dùng dài 4000 dòng

Khi bạn viết càng nhiều mã để sử dụng các phương thức của dịch vụ web, lớp của bạn sẽ nhanh chóng phát triển lâu dài. Điều này sẽ xảy ra đặc biệt nhanh chóng nếu có bất kỳ logic phức tạp nào liên quan đến việc định dạng các yêu cầu và phản hồi của phương thức dịch vụ web

Cách tiếp cận tôi sử dụng để giữ cho các lớp ngắn gọn là viết một lớp cho mỗi phương thức dịch vụ web. Đây là cách

client = $client
    }

    public function __call($method, $parameters)
    {
        if (! class_exists($class = $this->getClassNameFromMethod($method))) {
            throw new Exception("Method {$method} does not exist");
        }

        $instance = new $class($this->client);

        // Delegate the handling of this method call to the appropriate class
        return call_user_func_array([$instance, 'execute'], $parameters);
    }

    /**
     * Get class name that handles execution of this method
     *
     * @param $method
     * @return string
     */
    private function getClassNameFromMethod($method)
    {
        return 'App\\Methods\\' . ucwords($method);
    }
}

Lớp người tiêu dùng được tái cấu trúc hiện tìm kiếm một lớp trong không gian tên

client = $client
    }

    // ..
}
4\* có cùng tên với phương thức đang được gọi. Nếu tìm thấy, nó sẽ tạo một thể hiện của lớp và ủy quyền cho nó

Trong ví dụ của chúng tôi, một cuộc gọi đến

client = $client
    }

    // ..
}
5 sẽ được định tuyến nội bộ đến một lớp khác có tên là
client = $client
    }

    // ..
}
6

Cho dù chúng ta cần sử dụng bao nhiêu phương pháp, lớp người tiêu dùng của chúng ta sẽ không bao giờ lớn hơn nữa

Thưởng. lớp người tiêu dùng của chúng tôi hiện tuân theo nguyên tắc Mở và Đóng

Đây là lớp học

client = $client
    }

    // ..
}
6 của chúng ta trông như thế nào

client = $client
    }

    // ..
}
2

 

Bộ nhớ đệm cuộc gọi

Một kỹ thuật tối ưu hóa phổ biến là lưu vào bộ nhớ đệm các cuộc gọi dịch vụ web. Với một điều chỉnh nhỏ đối với người tiêu dùng của chúng tôi, chúng tôi có thể cho phép các lớp phương thức của mình chịu trách nhiệm về bộ nhớ đệm của riêng chúng

client = $client
    }

    // ..
}
3

Bất cứ khi nào một lớp phương thức triển khai giao diện

client = $client
    }

    // ..
}
8, phương thức
client = $client
    }

    // ..
}
9 sẽ được gọi thay thế. Nếu sử dụng Laravel, điều này có thể giống như bên dưới

client = $client
    }

    // ..
}
6

 

Ghi nhật ký cuộc gọi

Gỡ lỗi sẽ dễ dàng hơn nhiều nếu tất cả các cuộc gọi dịch vụ web của bạn được ghi lại. Vì chúng tôi đang đưa

client = $client
    }

    // ..
}
0 vào người tiêu dùng của mình nên chúng tôi có thể viết một trình trang trí đơn giản để ghi nhật ký tất cả các cuộc gọi dịch vụ web

client = $client
    }

    // ..
}
8

Để yêu cầu được ghi lại chính xác, chúng tôi cần bật theo dõi khi định cấu hình

shouldReceive('getBooks')
            ->once()
            ->andReturn(simplexml_load_string($this->getXml()))
            ->getMock();

        // Inject our mock SoapClient into the consumer
        // and make the call that we're testing...
        $response = (new Consumer($client))->getBooks();

        // Assert that the response is what we would expect...
        $this->assertEquals([
            [
                'title' => 'The Alchemist',
            ], [
                'title' => 'Veronica Decides To Die',
            ], [
                'title' => 'The Second Machine Age',
            ],
        ], $response);
    }

    private function getXml()
    {
        return <<
    
        
            The Alchemist
        
        
            Veronica Decides To Die
        
        
            The Second Machine Age
        
    

XML;
    }
}
1 của chúng tôi

client = $client
    }

    // ..
}
0

Tất nhiên, chúng ta có thể cấu hình Container của Laravel để xây dựng lớp người tiêu dùng một cách chính xác bất cứ khi nào chúng ta yêu cầu, bằng cách viết đoạn mã sau vào một nhà cung cấp dịch vụ

client = $client
    }

    // ..
}
1

 

Chấm dứt

Xử lý các dịch vụ web SOAP có thể là một công việc lộn xộn. Sử dụng và cải thiện các kỹ thuật được viết ở đây để làm cho quy trình dễ chịu hơn một chút

Làm cách nào để tạo dịch vụ web SOAP?

Chúng ta sẽ tạo một dự án Spring Boot nơi chúng ta sẽ xác định máy chủ SOAP WS của mình. .
4. 1. Phụ thuộc Maven. .
4. 2. Tệp XSD. .
4. 3. Tạo các lớp Java miền. .
4. 4. Thêm điểm cuối dịch vụ web SOAP. .
4. 5. Đậu cấu hình dịch vụ web SOAP

Làm cách nào để gọi dịch vụ web SOAP trong PHP?

Sử dụng phương thức như POST
Trong URL, hãy chuyển url api xà phòng hoặc url wsdl (https. //www. truy cập dữ liệu. com/webservicesserver/chuyển đổi số. wso?WSDL)
Trong phần Tiêu đề, hãy sử dụng => Loại nội dung. văn bản/xml
Chuyển yêu cầu XML bên dưới trong phần Nội dung dưới dạng dữ liệu thô

Làm cách nào để tạo yêu cầu SOAP trong PHP?

Để thực hiện các yêu cầu SOAP tới điểm cuối API SOAP, hãy sử dụng tùy chọn "Content-Type. application/soap+xml" tiêu đề yêu cầu , cho máy chủ biết rằng phần thân yêu cầu chứa một phong bì SOAP. Máy chủ thông báo cho máy khách rằng nó đã trả về một phong bì SOAP với "Kiểu nội dung. ứng dụng/xà phòng + xml" tiêu đề phản hồi.

Làm cách nào để tạo một dịch vụ Web trong PHP?

Dịch vụ web trong PHP (Cách tạo dịch vụ web đăng ký/đăng ký người dùng) .
SOAP (Giao thức truy cập đối tượng đơn giản).
REST (Chuyển giao trạng thái đại diện).
BƯU KIỆN. Tạo một tài nguyên mới
ĐẶT. Cập nhật một tài nguyên cụ thể theo một id
XÓA BỎ. Xóa một tài nguyên cụ thể
Ví dụ về POST