WebRequest для соединения с API Википедии

Если я правильно понял, вы просто хотите добавить перезагрузку после нажатия на одно из ваших ключевых слов.

Вы не уточнили, хотите ли вы сделать это только в PHP, поэтому я даю вам решение только для javascript.

/** {string} URL queries in string */
let urlQueriesString = window.location.search,
/** {string[]} URL queries in array */
	urlQueriesArray = urlQueriesString.substring(1).split('&'),
/** {Object.<string, string>} URL queries in object */
	urlQueries = {},
/** {string[]} List of search keywords */
	searchKeywords = [],
/** {HTMLElement[]} List of <li> which will be inserted into DOM */
    liElements;

// Fills in urlQueries object
for (let i in urlQueriesArray) {
	urlQueriesArray[i] = urlQueriesArray[i].split('=');
    
    urlQueries[urlQueriesArray[i][0]] = urlQueriesArray[i][1];
}

// Gets search keywords from _sft_category parameter
searchKeywords = urlQueries._sft_category.split('+'); // or .split(' ')

// Inserts a <li> in the DOM for each keyword
for (let i in searchKeywords) {
	let ul = document.getElementsByTagName('ul')[0],
        html = `<li>${searchKeywords[i]}</li>`;
    
    ul.innerHTML += html;
}

// Gets inserted <li>
liElements = document.getElementsByTagName('li');

// Adds an event on click for each <li>
for (let i in liElements) {
    let li = liElements[i];
    
    // Checks instance type because last element of liElements is the length and we don't want to do what's following for this one
    if (li instanceof HTMLElement) {
    	// Creates new URL on click
        li.addEventListener('click', function() {
            let url = window.location.hostname + window.location.pathname,
                keyword = this.innerText;
                
            searchKeywords = searchKeywords.filter((kw) => (kw !== keyword));
            
            url += urlQueriesString.replace(/_sft_category=[\w\d_+-]+/, `_sft_category=${searchKeywords.join('+')}`);
            
            console.log(url);
            
            // Uncomment next line for reload with new url
            // window.location.href = url;
        });
    }
}
<ul></ul>

Этот фрагмент кода может быть упрощен, но в настоящее время он должен выполнять свою работу.

Возможно, вам придется немного адаптировать его, чтобы он работал с вашим проектом.

10
задан Damjan Pavlica 18 October 2015 в 17:23
поделиться

3 ответа

Сначала вы можете попробовать запрос GET, потому что он немного проще (вам понадобится только в POST для входа в Википедию). Например, попробуйте смоделировать этот запрос:

http://en.wikipedia.org/w/api.php?action=query&prop=images&titles=Main%20Page

Вот код:

HttpWebRequest myRequest =
  (HttpWebRequest)WebRequest.Create("http://en.wikipedia.org/w/api.php?action=query&prop=images&titles=Main%20Page");
using (HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse())
{
    string ResponseText;
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        ResponseText = reader.ReadToEnd();
    }
}

Редактировать: Другая проблема, с которой он столкнулся при запросе POST, была Исключение: удаленный сервер возвратил ошибку: (417) Ожидание не удалось. Это можно решить, установив:

System.Net.ServicePointManager.Expect100Continue = false;

(это из: HTTP POST возвращает ошибку: 417 «Ожидание не выполнено». )

7
ответ дан 4 December 2019 в 02:27
поделиться

Вы, кажется, выдвигаете входные данные по HTTP POST, но, похоже, вам следует использовать HTTP GET.

Из документов MediaWiki API:

API принимает свои данные через параметры в строке запроса. каждый модуль (и каждое действие = запрос субмодуль) имеет свой набор параметры, которые перечислены в документация и в действии = помощь, и можно получить через действие = paraminfo. http://www.mediawiki.org/wiki/API:Data_formats

0
ответ дан 4 December 2019 в 02:27
поделиться

В настоящее время я на завершающей стадии реализации C # MediaWiki API, который позволяет легко создавать сценарии для большинства действий по просмотру и редактированию MediaWiki.

Основной API находится здесь: http://o2platform.googlecode.com/svn/trunk/O2%20-%20All%20Active%20Projects/O2_XRules_Database/_Rules/APIs/OwaspAPI.cs и вот пример используемого API:

var wiki = new O2MediaWikiAPI("http://www.o2platform.com/api.php");

wiki.login(userName, password);

var page = "Test"; // "Main_Page";

wiki.editPage(page,"Test content2");

var rawWikiText = wiki.raw(page);
var htmlText = wiki.html(page);

return rawWikiText.line().line() + htmlText;
1
ответ дан 4 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: