2012-06-23 3 views
1

Я пытаюсь использовать Jquery UI Autocomplete для извлечения синонимов для любого слова, используя Thesaurus API.jquery JSON удалить разделители из строк запроса

мне нужно сделать следующий запрос GET на JSon, чтобы получить доступ к API

http://words.bighugelabs.com/api/{version}/{api key}/{word}/{format} 

Jquery однако генерирует следующее возвращающий 404 Not Found

http://words.bighugelabs.com/api/?v=2&key=mykey&word=some-word&format=json 

Можно ли легко удалить разделители?

Script

$(function() { 
     function log(message) { 
      $("<div/>").text(message).prependTo("#log"); 
      $("#log").scrollTop(0); 
     } 

     $("#thesaurus").autocomplete({ 
      source: function(request, response) { 
       $.ajax({ 
        url: "http://words.bighugelabs.com/api/", 
        dataType: "json", 
        data: { 
         v: "2", 
         key: "mykey", //actually numbers 
         word: request.term, 
         format: "json" 
         //maxRows: 12, 
         //name_startsWith: request.term 
        }, 
        success: function(data) { 
         response($.map(data.geonames, function(item) { 
          return { 
           label: item.name + (item.noun ? ", " + item.noun : "") + ", " + item.syn, 
           value: item.name 
          } 
         })); 
        } 
       }); 
      }, 
      minLength: 2, 
      select: function(event, ui) { 
       log(ui.item ? 
        "Selected: " + ui.item.label : 
        "Nothing selected, input was " + this.value); 
      }, 
      open: function() { 
       $(this).removeClass("ui-corner-all").addClass("ui-corner-top"); 
      }, 
      close: function() { 
       $(this).removeClass("ui-corner-top").addClass("ui-corner-all"); 
      } 
     }); 
    }); 

HTML

<input id="thesaurus" /> 

</div> 

<div class="ui-widget" style="margin-top:2em; font-family:Arial"> 
    Result: 
    <div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div> 
</div> 

ответ

2

Весь смысл параметра данных для функции $.ajax() состоит в том, чтобы создать строку запроса (как POST, так и GET использовать строки запроса, они просто отправляются как разные части полезной нагрузки запроса). Вы просто хотите использовать простую конкатенацию строк для создания своего URL-адреса.

$.ajax({ 
    url: "http://words.bighugelabs.com/api/2/mykey/" + request.term + "/json", 
    dataType: "json", 
    success: function(data) { 
     response($.map(data.geonames, function(item) { 
      return { 
       label: item.name + (item.noun ? ", " + item.noun : "") + ", " + item.syn, 
       value: item.name 
      } 
     })); 
    } 
}); 

Вы имели статическую версию, ключ API и формат параметров, но если бы они были динамичными, URL-адрес будет выглядеть так:

"http://words.bighugelabs.com/api/" + version + "/" + api_key + "/" + request.term + "/" + format 

Чтобы сделать код немного очистителя вы могли бы даже пойти так далеко, как :

"http://words.bighugelabs.com/api/" + [version,api_key,request.term,format].join("/") 
+0

спасибо! с этой модификацией, как изменить часть 'response()'? это все еще необходимо? – CyberJunkie

+1

@CyberJunkie Обратный вызов 'success' и вызов функции' response() 'обрабатываются данными, возвращаемыми при вызове api. Предполагая, что вы хотите сделать что-то полезное с данными, которые api возвращает, они вам абсолютно необходимы. Я не знаю, как выглядит ваша функция ответа или что вам нужно сделать, поэтому я не могу быть более полезной. – Endophage

1

Перемещение данных в URL:

$("#thesaurus").autocomplete({ 
     source: function(request, response) { 
      $.ajax({ 
       url: "http://words.bighugelabs.com/api/2/" + "mykey/" + request.term + "/json", 
       .... 
      }); 
     }, 
1

Вы можете просто использовать

url:"http://words.bighugelabs.com/api/" 
      +"2/"+encodeURIComponent(mykey)+"/" 
      +encodeURIComponent(request.term)+"/json"), 

И удалите опцию data.

+0

На самом деле это не сработает. Это будет% encode '/', поэтому окончательный url будет выглядеть так: 'http://words.bighugelabs.com/api/2%2F % 2F % 2Fjson' Однако кодирование отдельных сегментов вероятно, хорошая идея. – Endophage

+0

@ Эндофаг, спасибо, сэр, обновил ответ. –

Смежные вопросы