2010-05-03 38 views
14

Tôi đang cố gắng sử dụng file_get_contents() để nhận phản hồi từ máy chủ và gặp lỗi này. Ai đó có thể cho tôi biết lý do và cách khắc phục nó là gì? Phần của mã là:Yêu cầu HTTP không thành công! HTTP/1.1 505 Phiên bản HTTP Không được hỗ trợ lỗi

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message"; 
$resp = file_get_contents($api); 

Máy chủ phản hồi chính xác khi tôi dán url vào trình duyệt. Tôi đã học được rằng điều này là do máy chủ từ chối phiên bản HTTP của khách hàng, nhưng tôi không biết tại sao điều đó lại xảy ra trong trường hợp của tôi.

Bất kỳ giúp đỡ được nhiều đánh giá cao. Cảm ơn trước

+0

Tôi cũng nhận được lỗi tương tự khi sử dụng 'curl'. – shyam

+0

Thử thay thế '$' bằng '% 24' của bạn. Nó có thể không phải là nguyên nhân gây ra vấn đề của bạn, nhưng bạn nên mã hóa đúng các ký tự của mình. – Kylar

+0

'$' thực sự là cho biến. Và tôi đã tìm thấy nguyên nhân gây ra lỗi và đó là urlencoding. Tôi đã không nhận thấy nó trước đó bcos kịch bản đã được làm việc trước đó, và tôi đã bỏ lỡ chức năng sau một chút chỉnh sửa. Nhờ tất cả những người đã cố gắng giúp đỡ ... và thực sự là câu trả lời của bạn khi có thông tin. – shyam

Trả lời

29

Tôi đã tìm thấy sự cố và đó là lỗi mã hóa đơn giản - thiếu mã hóa url.

Lý do tôi không nhận thấy nó lúc đầu là vì mã đã được chấp thuận trước khi tôi thực hiện một số chỉnh sửa và tôi đã bỏ lỡ chức năng urlencode() trước khi gọi máy chủ, gây ra một khoảng trống trong url.

Điều này có vẻ là lý do khiến lỗi này xảy ra đối với hầu hết mọi người. Vì vậy, nếu bạn gặp phải điều này, hãy sử dụng urlencode() trên tất cả các biến có thể chứa khoảng trắng trong giá trị của nó được sử dụng làm thông số URL. Vì vậy, trong trường hợp trong câu hỏi của tôi, mã cố định sẽ trông giống như:

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=" . urlencode($message); 
$resp = file_get_contents($api); 

Ngoài ra, cảm ơn tất cả thời gian và phản hồi của bạn, những thông tin đó là thông tin.

+0

Tôi đã có một url được cung cấp và không đổi chỗ ở phần sau của nó. Đã làm như vậy và nó đã sửa nó cho tôi. –

0

Bạn có thể ngửi thấy những gì đang xảy ra trên dây không? Nhìn thấy định dạng của yêu cầu HTTP khi nó đi ra trên dây sẽ giúp ích rất nhiều.

Nếu không thấy điều đó, phỏng đoán tốt nhất của tôi là máy chủ không được triển khai tốt và đang từ chối yêu cầu HTTP/1.1. Hãy thử đặt --http1.0 trên Curl và nhìn thấy những gì xảy ra ...

+0

bạn có thể vui lòng cho tôi biết cách xem định dạng của yêu cầu HTTP ..? – shyam

+0

Bạn không thể làm như vậy với file_get_contents. Đó là một phương pháp tìm nạp cực kỳ braindead cho phép bạn không kiểm soát được yêu cầu HTTP được thực hiện như thế nào. Không có tiêu đề được trả lại, và bạn không thể làm bất cứ điều gì, nhưng một 'GET' đơn giản. Để nhận tiêu đề và/hoặc thực hiện các phương thức yêu cầu HTTP khác, bạn sẽ phải sử dụng CURL –

9

Bạn có thể create a stream context với phiên bản HTTP thiết đến 1.0 và sử dụng bối cảnh với file_get_contents:

$options = array(
    'http' => array(
     'protocol_version' => '1.0', 
     'method' => 'GET' 
    ) 
); 
$context = stream_context_create($options); 
$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message"; 
$resp = file_get_contents($api, false, $context); 

Bằng cách này: Đừng quên để thoát đối số URI của bạn có giá trị đúng với urlencode.

0

Tôi gặp sự cố tương tự và trong trường hợp của tôi thủ phạm là ký tự đại diện/ký tự CRLF ở cuối URL yêu cầu, không bị bắt bởi urlencode() (hoặc có thể mã hóa nó nhưng vẫn gây ra máy chủ để tạo lỗi). Khi tôi đã tìm thấy sự cố, các yêu cầu bắt đầu hoạt động trở lại, ngay cả khi không có tùy chọn ngữ cảnh luồng.

Hy vọng điều này sẽ giúp người khác.

0

Một thời gian chúng tôi vẫn nhận được lỗi với

file_get_contents($api); 

trong trường hợp đó, hãy thử này:

fopen($api,"r"); 
0

Tôi cũng đã phải đối mặt với vấn đề này cùng .. sau tôi phát hiện ra rằng trong khi lấy kết quả từ mysql, Giới hạn số lượng $, $ count is -ve. sửa chữa rằng url hoạt động tốt. Chỉ có một số sự cố trong url và không phải vấn đề về phiên bản http hoặc tệp file_get_contents.

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