2009-07-27 29 views
7

Tôi đã thử nghiệm một dịch vụ web bằng PHP và Python. Địa chỉ của dịch vụ web là, giả sử, http://my.domain.com/my/webservice. Khi tôi thử nghiệm dịch vụ web bằng PHP bằng cách sử dụng URL đó, mọi thứ hoạt động tốt. Nhưng, khi tôi sử dụng cùng một vị trí nhưng trong Python bằng cách sử dụng SOAPpy tôi nhận được một lỗi.Tại sao dấu gạch chéo trong dịch vụ web lại quan trọng như vậy?

Dưới đây là đoạn code tôi sử dụng để giao tiếp với các dịch vụ web (Python):

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice', namespace) 
server.myFunction() 

Các phản ứng tôi nhận được từ máy chủ:

HTTPError: <HTTPError 301 Moved Permanently> 

Tôi hình dung ra rằng nếu tôi thêm một dấu gạch chéo tới vị trí dịch vụ web mà nó hoạt động!

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice/', namespace) 
server.myFunction() 

Tại sao thiếu dấu gạch chéo có thể gây ra lỗi?

Trả lời

19

Chúng là các URL khác nhau. http://my.domain.com/my/webservice ngụ ý tệp webservice trong thư mục my. http://my.domain.com/my/webservice/ ngụ ý tài liệu mặc định bên trong thư mục my/webservice.

Nhiều máy chủ web sẽ tự động sửa các URL đó, nhưng không bắt buộc phải làm như vậy.

2

[Tuyên bố từ chối trách nhiệm: Đây là bản sao câu trả lời của tôi from here. Tôi biết một số người không thích loại này sao chép, nhưng điều này giải thích tại sao các dấu gạch chéo là rất quan trọng.]

Hãy tưởng tượng bạn phục vụ một trang

http://mydomain.com/bla 

chứa

<a href="more.html">Read more...</a> 

Khi được nhấp , trình duyệt của người dùng sẽ truy xuất http://mydomain.com/more.html. Nếu bạn đã từng phục vụ

http://mydomain.com/bla/ 

(có cùng nội dung), trình duyệt sẽ truy xuất http://mydomain.com/bla/more.html. Để tránh sự mơ hồ này, chuyển hướng nối thêm dấu gạch chéo nếu URL trỏ đến một thư mục.

3

Lỗi là chuyển hướng 301 có nghĩa là bạn đang được chuyển hướng đến URL có dấu gạch chéo ở cuối máy chủ web.

Có vẻ như PHP sẽ tự động theo chuyển hướng này và do đó không ném lỗi, trong khi Python thì không. Bạn sẽ cần phải làm như sau:

  1. cố gắng kết nối đến URL ban đầu
  2. Catch bất kỳ chuyển hướng 301 và có thể là 302 chuyển hướng cũng
  3. Nếu có một chuyển hướng sau đó cố gắng kết nối với URL mà thay vào đó .

URL mới sẽ có sẵn trong tiêu đề phản hồi.

HTH.

0

URL SOAP trông như thế nào là tùy thuộc vào máy chủ, nếu dấu gạch chéo là cần thiết phụ thuộc vào máy chủ và triển khai SOAP.

Trong trường hợp của bạn, tôi cho rằng máy chủ đích là máy chủ apache và URL SOAP thực ra là thư mục chứa tập lệnh xử lý SOAP của bạn. Khi bạn truy cập http://my.domain.com/my/webservice trên máy chủ, apache quyết định rằng thư mục được giải quyết đúng cách là http://my.domain.com/my/webservice/ và gửi chuyển hướng 301.

SOAP sử dụng POST http, tùy thuộc vào khách hàng để quyết định xem chuyển hướng có nên được theo dõi hay không, tôi cho rằng nó không mong đợi một.

Triển khai SOAP khác, ví dụ: Apache Axis trong Java có các URL trông giống như Servlets, ví dụ: http://domain.com/soap/webservice không có dấu gạch chéo, trong trường hợp này, URL không có dấu gạch chéo là chính xác, không có thư mục nào tồn tại.

Trục cũng không thành công trên chuyển hướng.

Các vấn đề liên quan