2012-10-12 9 views
7

Serwer nie zaakceptuje żadnych parametrów w adresie URL żądania, więc muszę usunąć wszystkie dodatkowe parametry z adresu URL i oczywiście nie mogę kontrolować serwera.Czy mogę utworzyć żądanie JSONP jQuery bez dodawania parametru? Callback = 'w adresie URL?

jQuery:

$.ajax({ 
    type: 'GET', 
    url: 'http://cross-domain.com/the_jsonp_file, 
    jsonpCallback: 'jsonCallback', 
    contentType: 'application/json', 
    cache: 'true', 
    dataType: 'jsonp', 
    success: function(json) { 
     console.log(json); 
    }, 
}); 

Plik JSONP:

jsonCallback({"test": "hello"}); 

Kiedy wysłać ten wniosek Ajax URL wygląda następująco:

http://cross-domain.com/the_jsonp_file?callback=jsonCallback 

Ale muszę to (bez parametry):

http://cross-domain.com/the_jsonp_file 

EDIT:

Oto cała moja sytuacja:

function MyClass(imgs) { 
    // imgs is array of URLs 
    this.imgs = imgs; 

    this.submit = function() { 
     // button click event triggers this method 
     this._show(); 
    }; 

    this._show = function() { 
     var _this = this; 

     for (var i = 0; i < _this.imgs.length; i++) { 
      (function($, j) { 
       $.ajax({ 
        type: 'GET', 
        url: _this.imgs[j], 
        jsonp : false, 
        jsonpCallback: 'jsonCallback', 
        cache: 'true', 
        dataType:'jsonp', 
        success: function(json) { 
         console.log(_this.imgs[j]); 
           }, 
       }); 
      })(jQuery, i); 
     }; 
    }; 
}; 

I mam ten komunikat o błędzie:

Uncaught TypeError: Property 'jsonCallback' of object [object Window] is not a function 

dziwne jest to mało żądania są pomyślnie wywołanie jsonCallback.

+0

Serwer odrzuca żądania z ciągami zapytań? –

+1

Być może najlepiej byłoby napisać sam kod JSONP, zamiast używać jQuery ... – lonesomeday

+0

Próbowałem 'dataType: 'script'' w ustawieniu ajax i robiłem URL bez parametrów, ale nie mam pojęcia, jak wykonać wywołanie zwrotne funkcja działa. – Jonypoins

Odpowiedz

9

Sprawdź docs jQuery - mówią powiedzieć jsonp: false i jsonpCallback: 'callbackFunction' w Ajax args .... jak:

$.ajax({ 
    url: 'http://cross-domain.com/the_jsonp_file', 
    jsonp : false, 
    jsonpCallback: 'jsonCallback', 
    // contentType: 'application/json', -- you can't set content type for a <script> tag, this option does nothing for jsonp | KevinB 
    cache: 'true', 
    dataType : 'jsonp' 
}); 

http://api.jquery.com/jQuery.ajax/

+0

Dzięki. Wydaje się, działa, ale mam ten komunikat o błędzie: "Uncaught TypeError: Property" jsonCallback "obiektu [object Window] nie jest funkcją. kilka elementów pomyślnie wywołuje funkcję zwrotną. – Jonypoins

+0

@Jonypoins Czy używasz jQuery 1.5+? –

+0

Używam jQuery 1.8.2 – Jonypoins

0

JSONP wymaga zwrotnego jako część adresu URL. Zgaduję na podstawie opisu, że serwer, do którego uzyskujesz dostęp, nie obsługuje JSONP.

jQuery dodaje do dokumentu skrypt, który po dodaniu uruchamia żądanie API, odpowiedź wywołuje funkcję zwrotną w kodzie (to jest uproszczenie).

Możesz rzucić okiem na Wikipedię, jeśli chcesz dokładniej opisać. http://en.wikipedia.org/wiki/JSONP#How_it_works

+0

Tak, serwer nie obsługuje JSONP, ale chcę używać zasobów z serwera przy użyciu JSONP. – Jonypoins

+2

Niestety, serwer musi obsługiwać JSONP, aby działał. W przeciwnym razie pojawi się wspomniany wyżej błąd skryptu. Masz 2 inne opcje: 1. Konfigurowanie proxy. 2. CORS (wymaga to również konfiguracji serwera) – Dcullen

+0

"Każde żądanie wywołuje ten sam oddzwanianie jsonCallback, więc pomyślałem, że to jest problem." - to był mój problem. dzięki. +1 – offset

1

Każde żądanie wywołuje ten sam oddzwonienie jsonCallback, więc pomyślałem, że to jest problem.

Najpierw JavaScript w dokumencie:

<script type="text/javascript"> 
    new Gallery([ 
     ['http://cross-domain.url/whatever', '27b2afa5c77c2510'], 
     ['http://cross-domain.url/whatever', '13df51b2f2801bc1'], 
     ['http://cross-domain.url/whatever', '4de326fc9a2c5a24'], 
     ['http://cross-domain.url/whatever', '60c266a73ba699bc'], 
     ['http://cross-domain.url/whatever', '3db01e95aaf2b9f2'], 
     ['http://cross-domain.url/whatever', '94eb17f9b0e1be9c'], 
     ['http://cross-domain.url/whatever', 'ca8c5c3c0b8cd5ae'], 
     ['http://cross-domain.url/whatever', '6b0f5c5737ee88fd'], 
     ['http://cross-domain.url/whatever', '318d8ebb51a97a15'], 
     ['http://cross-domain.url/whatever', 'f5028c8b62e81a8b'], 
    ]); 
</script> 

przesłane klienta jsonp plik (tylko kolejny plik JavaScript) do serwera, takie jak ten:

jsonCallback_27b2afa5c77c2510({"test": "hello"}); 

Dodano losowy ciąg hex po jsonCallback_ oddzielić każdy takie żądania jak domyślne wywołanie zwrotne jQuery.

Czytaj losowy ciąg szesnastkowy z wejścia i ustawić jako jsonpCallback:

function Gallery(imgs) { 
    // imgs is array of URLs 
    this.imgs = imgs; 

    this.submit = function() { 
     // button click event triggers this method 
     this._show(); 
    }; 

    this._show = function() { 
     var _this = this; 

     for (var i = 0; i < _this.imgs.length; i++) { 
      (function($, j) { 
       $.ajax({ 
        type: 'GET', 
        url: _this.imgs[j][0], 
        jsonp : false, 
        jsonpCallback: 'jsonCallback_' + _this.imgs[j][1], 
        cache: 'true', 
        dataType:'jsonp', 
        success: function(json) { 
         // Process 
         console.log(json.test); 
        }, 
       }); 
      })(jQuery, i); 
     }; 
    }; 
}; 

Dziękuję @Adam @Kevin B @Dcullen i wszyscy!: D

p.s: Wpisałem wszystkie źródła powyżej tylko na przykład, może to nie być poprawne.

Powiązane problemy