Przesyłanie danych metodą POST z dołączaniem własnych nagłówków

0

Hej!

Pracuję nad projektem wykorzystującym eBay Trading API. Jednak ze względów technologicznych mogę wykorzystać tylko JS/jQuery i HTML.
Aby wygenerować klucz sesji potrzebuję przesłać na podany adres dane w formacie xml metodą POST. Jednak użycie jQuery.post() nie jest możliwe, ponieważ (o ile mi wiadomo) nie da się dodać własnych nagłówków HTTP. Otóż część przesyłanych danych (id użytkownika, nazwa wywoływanej funkcji, itp) musi zostać dołączona jako nagłówek, natomiast reszta (np. application id) musi widnieć jako przesyłane dane. Stąd moje pytanie:
Jak mogę za pomocą JavaScript przesłać dane XML przy jednoczesnym dołączeniu własnych nagłówków HTTP metodą POST?

Wygooglowałem funkcję jQuery.ajax(), ale poniższy kod nie działa (generuje metodę OPTIONS zamiast POST).
Wykaz przesłanych danych (wzięte z FireBuga):

**Nagłówki odpowiedzi**

HTTP/1.1 200 OK
Allow: GET, HEAD, POST, TRACE, OPTIONS
Server: Apache-Coyote/1.1
X-EBAY-ESB-GUID: urn:uuid:8DF4B95E670525E45E1331304146086
Date: Mon, 05 Mar 2012 18:47:49 GMT
Content-Length: 0
Connection: keep-alive

**Nagłówki zapytania**

OPTIONS /ws/api.dll HTTP/1.1
Host: api.sandbox.ebay.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-ebay-api-app-name,x-ebay-api-call-name,x-ebay-api-cert-name,x-ebay-api-compatibility-level,x-ebay-api-dev-name,x-ebay-api-siteid
Pragma: no-cache
Cache-Control: no-cache

Kod źródłowy:

<!DOCTYPE html>
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <form id="searchForm">
   <input type="submit" value="connect" />
  </form>
  <!-- the result of the search will be rendered inside this div -->
  <div id="result"></div>

<script>
  /* attach a submit handler to the form */
  $("#searchForm").submit(function(event) {

    /* stop form from submitting normally */
    event.preventDefault(); 
        
    /* get some values from elements on the page: */
  
        url = "https://api.sandbox.ebay.com/ws/api.dll";


	var xml_data="xml=<?xml version=\"1.0\" encoding=\"utf-8\"?><GetSessionIDRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\"><RuName>***</RuName></GetSessionIDRequest>";

    $.ajax({
      url: url,
      type: "POST",
	  data: xml_data,
	       beforeSend: function( xhrObj ) {
        //xhrObj.setRequestHeader("Accept", "text/javascript");
	xhrObj.setRequestHeader("X-EBAY-API-APP-NAME","***");
	xhrObj.setRequestHeader("X-EBAY-API-DEV-NAME","***");
	xhrObj.setRequestHeader("X-EBAY-API-CERT-NAME","***");
	xhrObj.setRequestHeader("X-EBAY-API-COMPATIBILITY-LEVEL","655");
	xhrObj.setRequestHeader("X-EBAY-API-CALL-NAME","GetSessionID");
	xhrObj.setRequestHeader("X-EBAY-API-SITEID","0");
      },
      success: function( data ) {
        if (console && console.log){
          console.log( 'Sample of data:', data.slice(0,100) );
    }
  }
});
  });
</script>

</body>
</html>
0

Użyj $.post()?

0

O ile mi wiadomo, $.post nie może dołączać własnych nagłówków. Dodane zostają tylko standardowe.

0

przeglądarka generuje zapytanie OPTIONS bo sprawdza czy strona zezwala na zapytania CROSS DOMAIN (pomiędzy domenami) z Twojej domeny
To takie zabezpieczenie na wypadek gdybyś chciał w imieniu klienta wysyłać formularze POST
a skoro przeglądarka nie ponawia zapytania POSTem to widocznie nie dostała zezwolenia od serwera ebaya toteż nic za pomocą javascriptu tam nie wyślesz - gdyby takiego zabezpieczenia nie było to można by wtedy wykorzystywać odwiedzających Twoją stronę jako przykładowo spamboty nawet bez instalowania im żadnego programu
czy chociażby tak jak tutaj - korzystając z tego że użytkownik byłby już zalogowany w jakimś serwisie - mógłbyś w jego imieniu kupić coś na ebayu, lub nawet przelać sobie pieniądze z jego konta bankowego - tak więc byłaby to naprawdę spora luka bezpieczeństwa i powinieneś się raczej cieszyć że nie jest to możliwe

Ale oprócz tego że się tego nie da zrobić w javascripcie (o ile API Ebaya nie udostępnia metody przez JSONP) to i tak powinieneś to zrobić w PHP i w javascriptcie tylko odpytywać swój skrypt PHP który się będzie dopiero łączył z API Ebaya

A to dlatego że Twój klucz API inaczej byłby widoczny dla każdego w źródle strony a nie po to dostaje się prywatne klucze żeby je publicznie manifestować

0 użytkowników online, w tym zalogowanych: 0, gości: 0