1

Тема: POST запросы.

Доброго дня.

Думаю что всю простыню не обязательно тут выкладывать. Кусок кода не пашет. Помогите. Пишется для greasemonkey+firefox, кроссбраузерность не нужна. Про встроенные методы с запросами в Грисманки знаю. Хочется знать почему так не пашет.

lPage = 'url';
lParam = 'pfram';
function SendRequestPOST(){
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST",lPage,true);
    xmlhttp.onreadystatechange = processRequestChange;
    params = 'id=' + encodeURIComponent(lParam)
    xmlhttp.setRequestHeader("Content-Type", "text/plain; charset=windows-1251");
    xmlhttp.send(params);
    pole.innerHTML = "Обновление информации ...";
}

function processRequestChange(){
    if (xmlhttp.readyState == 4){
        if (xmlhttp.status == 200){
            pole.innerHTML = "Обновление успешно.";
        };
    };
}

При формировании запроса, не передаются заголовок ("Content-Type", "text/plain; charset=windows-1251") и параметр (xmlhttp.send(params)

wtf?

Нас невозможно сбить с пути, нам пофигу куда идти.

2 (изменено: DnsIs, 2012-02-10 09:28:24)

Re: POST запросы.

О!
Если заменить строку
xmlhttp.setRequestHeader("Content-Type", "text/plain; charset=windows-1251");
на
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=windows-1251");

то параметры все-таки передаются - xmlhttp.send(params) отрабатывает. Но "charset=windows-1251", все равно игнорируется.

И страница возвращается с абракадаброй.

Нас невозможно сбить с пути, нам пофигу куда идти.

3

Re: POST запросы.

Ура, получилось. Не знаю правда почему и как.

xmlhttp.setRequestHeader ("Content-type", "application\/x-www-form-urlencoded");
xmlhttp.overrideMimeType ("text/html;charset=windows-1251");

Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: POST запросы.

Всем спасибо.

Нас невозможно сбить с пути, нам пофигу куда идти.

5

Re: POST запросы.

Accept-Charset: windows-1251. Нет?

( 2 * b ) || ! ( 2 * b )

6 (изменено: DnsIs, 2012-02-10 11:23:32)

Re: POST запросы.

Rumata пишет:

Accept-Charset: windows-1251. Нет?

Это вы о чем?

ps. Пишу бывшему однокласснику сриптик для он-лайн игры.

Нас невозможно сбить с пути, нам пофигу куда идти.

7

Re: POST запросы.

Поздно ответил. Пока вспоминал написание заголовка, задающего кодировки, приемлемые в отклике сервера, Вы уже сами нашли решение. Я имел в виду отправку на сервер этой строки в качестве дополнительного заголовка.

( 2 * b ) || ! ( 2 * b )

8

Re: POST запросы.

Как оказалось, при отправке заголовка ("Content-type", "application\/x-www-form-urlencoded"), запрос всегда отправляется в UTF-8, поэтому отправлять charset=windows-1251, бессмысленно. И ответ собственно приходить тоже в UTF-8.
Спасает overrideMimeType  ("text/html;charset=windows-1251"); (Gecko only), который как раз и получает ответ в заданной кодировке.

Нас невозможно сбить с пути, нам пофигу куда идти.

9 (изменено: besik, 2012-07-01 15:29:49)

Re: POST запросы.

overrideMimeType  ("text/html;charset=windows-1251");

Спасает и меня.
Но я столкнулся с проблемкой что параметры на русском языке некорректно передаются ...  Я понимаю что передавать надо так :

 "param="+encodeURIComponent(parametr)

Но когда смотрю когда не мой скрипт отправляет пост запрос , а на том сайте то в пост запросе кодируется к примеру не "привет" а сначала во что то перекодируется ("привет" выглядит как "ïðèâåò" ) и потом эти каракули в UTF-8 преобразуются и отсылаються нормально.
Так вот если я кодирую encodeURIComponent и посылаю привет - то мне фигушки, а если каракули таким же образом отправлять то все отличненько. Вопрос как мне привести русские  слова вот к таким каракулям что бы мой скриптик и русские слова отрабатывал нормально ?

Пишется для greasemonkey+firefox.
POST запрос отсылаю через GM_xmlhttpRequest , так как нужно послать кроссдоменный запрос. Второй вопрос: для хромого если переделывать скрипт то чем можно воспользоваться вместо GM_xmlhttpRequest, что бы не доставлять еще чего то из дополнений.

10

Re: POST запросы.

В общем кое-как разобрался : Если нужно отсылать данные в UTF-8 то подходит ф-ция encodeURIComponent() , а мне нужно было из СP1251 получить Urlencoded. Может кому еще пригодится в будующем :

var trans=[];
var snart=[];
for(var i=0x410;i<=0x44F;i++)
{
trans[i]=i-0x350;
snart[i-0x350] = i;
}
trans[0x401]= 0xA8;
trans[0x451]= 0xB8;
snart[0xA8] = 0x401;
snart[0xB8] = 0x451;
CP1251urlencode = function(str)
{
var ret=[];
for(var i=0;i<str.length;i++)
{
var n=str.charCodeAt(i);
if(typeof trans[n]!='undefined')
n = trans[n];
if (n <= 0xFF)
ret.push(n);
}

return escape(String.fromCharCode.apply(null,ret));
}

У хромого как оказалось для пользовательских скриптов XMLHttpRequest() поддерживает кроссдоменные запросы поэтому что бы код не особо менять сделал аналогичную функцию :


GM_xmlhttpRequest = function(params) {
  var request = new XMLHttpRequest()
  
  request.onreadystatechange = function() {
    if (params.onreadystatechange) params.onreadystatechange(request)
    if (request.readyState == 4) {
      if (request.status >= 200 && request.status < 400) if (params.onload) params.onload(request)
      else if (params.onerror) params.onerror(request)
    }
  }
  
  request.open(params.method, params.url, true)
  if (params.headers) for (name in params.headers)
    request.setRequestHeader(name, params.headers[name])
  
  request.send(params.data)
  return request

}

В общем теперь в FF все отлично а в хроме застрял с парсингом ответа , я в этих делах только начинаю разбираться поэтому прошу помощи , подскажите чем проще воспользоваться ?

в FF реализовал аналогичное так :

var parser = new DOMParser();
var doc = parser.parseFromString(response.responseText,'text/html');

А в хроме так не получилось