2013-07-12 36 views
6

Tôi đang gặp sự cố khi phân tích cú pháp yêu cầu 'jsonp' với chức năng json_decode của php.PHP: Xử lý đầu ra 'JSONP' so với 'JSON' và phân tích cú pháp của nó?

Câu hỏi của tôi là

a. Việc sử dụng chức năng gọi lại trong 'jsonp' là gì, tôi có nên tắt chuyến đi hay tôi giả sử sử dụng chức năng này theo cách nào đó. ?

b. Làm cách nào để khắc phục lỗi cú pháp nhận được ở định dạng 'jsonp'?

Dưới đây tôi đã đưa ra mã và phản hồi mà tôi nhận được.

1. Tôi yêu cầu một url mẫu với curl PHP

$url = 'https://ssl.domain.com/data/4564/d.jsonp'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url);     
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);   
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");  
$feed = curl_exec($ch); 
curl_close($ch); 

echo $feed = gzdecode($feed); // Success its displays the jsonp feed 

2. Sau đó, tôi cố gắng json_decode đầu ra nhận được, mà ném lỗi không 4 ý nghĩa JSON_SYNTAX_ERROR, lý do tôi đoán là vì tên của loại chuỗi trong jsonp không được trích dẫn. ví dụ. Categories, Name, Position, vv

$json_feed = json_decode($feed); 
$error = json_last_error(); 
echo $error;  // Throws error no. 4 

3. RAW 'jsonp' đầu ra từ url.

domain_jsonp_callback({ 
    Categories:[ 
     { 
     Name:"Artifacts", 
     Position:14, 
     Count:70, 
     ImageUrls:{ 
      i100:"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png", 
      i120:"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png", 
      i140:"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png", 
      i180:"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png", 
      i220:"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png", 
      i280:"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png" 
     } 
     } 
    ] 
}); 
+1

Kiểm tra câu trả lời này: http://stackoverflow.com/a/5081588/1788516 – Perry

+0

@ Perry, cảm ơn tôi đã thấy câu trả lời đó, nhưng có lý do nào khiến máy chủ phản hồi gửi chức năng gọi lại không. Đó là chức năng gọi lại phải phục vụ một số mục đích phải không? –

Trả lời

2

việc sử dụng các cuộc gọi trở lại chức năng trong 'jsonp' là gì, nên tôi chỉ vấp mà tắt hoặc tôi giả sử sử dụng nó theo cách nào đó. ?

JSON-P thực sự là một tập lệnh JavaScript bao gồm một cuộc gọi hàm với một đối số.

Nếu bạn muốn phân tích cú pháp trong PHP, thì có, bạn cần xóa nó đi. Bạn cũng cần phải bỏ qua số ); ở cuối.

b. Làm thế nào tôi có thể khắc phục lỗi cú pháp nhận được trong định dạng 'jsonp'?

Bạn cần sửa dữ liệu để thực sự là JSON. Dữ liệu bạn có là một chữ JavaScript, nhưng nó không phù hợp với tập con của JavaScript khớp với JSON (ví dụ: tên thuộc tính không phải là chuỗi nhưng phải là).

Sẽ tốt hơn nếu bạn tạo nguồn tài nguyên JSON thực thành nguồn thay thế.

+0

làm rõ điều gì đó sẽ thử và cho bạn biết. –

1

Không chắc về điều đó nhưng tôi nghĩ rằng tên cũng nên được trích dẫn như thế này:

domain_jsonp_callback({ 
    Categories:[ 
     { 
     "Name":"Artifacts", 
     "Position":14, 
     "Count":70, 
     "ImageUrls":{ 
      "i100":"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png", 
      "i120":"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png", 
      "i140":"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png", 
      "i180":"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png", 
      "i220":"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png", 
      "i280":"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png" 
     } 
     } 
    ] 
}); 

PS: Có lẽ "Categories" quá:?

+0

Tôi nghĩ rằng sẽ được chăm sóc bởi các máy chủ đáp ứng, tiếc là nó không. Có cách nào mà nó có thể được quản lý với một số chức năng php. –

+0

Vâng ... dữ liệu thô đến như chuỗi, có vẻ sai nhưng u có thể chỉnh sửa nó giống như bất kỳ chuỗi nào khác. (nên có một cách tốt hơn để làm điều này) Bạn có thể thử đọc nó từng dòng phát nổ nó trên ":" và thiết lập phần tử đầu tiên để có dấu ngoặc kép và viết lại nó thành một chuỗi khác, sẽ là JSON hợp lệ ... –

+0

cảm ơn sẽ cố gắng đó như là phương sách cuối cùng, vì đó là tẻ nhạt trên máy chủ để xử lý mọi yêu cầu người dùng một trang. –

2

Chức năng gọi lại là dành cho các cuộc gọi JS - nó cho phép sử dụng API theo cách AJAX, mà không cần quan tâm chính sách gốc. Khi cuộc gọi JSONP được sử dụng trong JS - trình duyệt chỉ cần gọi hàm gọi lại cần được xác định trên phía máy khách API.

Khi bạn sử dụng JSONP bên trong hàm gọi lại PHP là không cần thiết chút nào. Nếu máy chủ hỗ trợ cuộc gọi kiểu JSON liệu - sử dụng nó, nếu không nói là dải các chuỗi hàm callback, trong trường hợp của bạn

$jsonData = json_decode(substr($feed, 22, -2)); 
Các vấn đề liên quan