Страницы

Поиск по вопросам

Показаны сообщения с ярлыком get. Показать все сообщения
Показаны сообщения с ярлыком get. Показать все сообщения

понедельник, 24 февраля 2020 г.

Ajax запрос с интервалом

#javascript #jquery #ajax #post #get


Проблема в следующем надо AJAX запросом создать документ, потом открыть документ
по id который был присвоен в первом запросе.

Но дело в том что запрос происходит слишком быстро и данные не успевают сохраниться
и вывод файла соответственно не получается сделать, пробывал setTimeout и setInterval,
но тогда при втором запросе не находит id который был присвоен в первом.

Как сделать небольшой интервал между первым и вторым запросом и что бы id оставалось
во втором запросе ?



    


Ответы

Ответ 1



Было бы логичнее сделать задержку на сервере и возвращать ответ только после записи в файл. На клиенте стОит воспользоваться промисами. Например сделать так: $('a.save').click(function call() { var text = $("#text").val(); $.ajax({ //Тут присваиваем id type: 'POST', dataType: 'json', url: 'http://site.ru/document/?text=' + text }).then(function(jsondata) { // тут создаем задержку в 500мс var defer = $.Deferred(); setTimeout(function() { defer.resolve(jsondata); }, 500); return defer.promise(); }, function() { // показываем 'ошибка' если неудачно выполнен первый запрос $('.results').html('ошибка'); }).then(function(jsondata) { // выполняется второй запрос id = jsondata.id; return $.ajax({ type: 'GET', dataType: 'json', url: 'http://site.ru/document/' + id }) }).then(function(jsondata) { // выполняется после удачного второго запроса var stdout = jsondata.stdout; console.log(stdout); }, function() { // показываем 'ошибка' если неудачно выполнен второй запрос $('.results').html('ошибка'); }); }); И, кстати, вместо error: $('.results').html('ошибка'), cтоило написать хотя бы error: function() { $('.results').html('ошибка'); }, иначе "ошибки" будут показаны в момент отправки запроса.

Ответ 2



Как ответили выше используйте промисы. Вот отличная статейка, советую уделить внимание "чейнингу" тут // сделать запрос $.get('https://learn.javascript.ru/article/promise/user.json') // 1. Получить данные о пользователе в JSON и передать дальше .then(response => { console.log(response); let user = JSON.parse(response); return user; }) // 2. Получить информацию с github .then(user => { console.log(user); return httpGet(`https://api.github.com/users/${user.name}`); }) // 3. Вывести аватар на 3 секунды (можно с анимацией) .then(githubUser => { console.log(githubUser); githubUser = JSON.parse(githubUser); let img = new Image(); img.src = githubUser.avatar_url; img.className = "promise-avatar-example"; document.body.appendChild(img); setTimeout(() => img.remove(), 3000); // (*) }); При чейнинге, то есть последовательных вызовах .then…then…then, в каждый следующий then переходит результат от предыдущего.

воскресенье, 2 февраля 2020 г.

В адресной строке квадратные скобки пишутся вот таком виде “%5B%5D”

#html #get #html_form


Добрый день.

Есть форма с чекбоксами, метод передачи GET (часть html кода):

....
 Сервер 1
 Сервер 2
 Сервер 3
 Сервер 4
....


Если в браузере (хроме) заполнить поля и отметить, допустим, первый чекбокс, нажать
кнопку "отправить", то в адресной строке появиться вот такая запись:

mysite.ru/?serv%5B%5D=1 

%5B%5D - это ANSII код (если я не ошибся) символов "[]".

В ФФ все нормально, ИЕ, Хром и Старая опера - %5B%5D  (в новой не смотрел).
На странице установлено:




В htaccess установлено (я думаю, что это не важно):

AddDefaultCharset UTF-8


Вопрос

Как, не меняя логики формы, отобразить в адресной строке не mysite.ru/?serv%5B%5D=1,
а mysite.ru/?serv[]=1.

Большое спасибо за ответы.

(Добавлено)


  никак, ваши формы работают корректно, именно так как и должны работать.


Спасибо за ответ!
Но, как тогда получилось вот тут:

 rst.ua/oldcars/alfaromeo/?year[]=0&year[]=0&price[]=0&price[]=0&engine[]=0&engine[]=0&gear=0&fuel=0&drive=0&condition=0&model[]=11&model[]=15&model[2]=20&from=sform

    


Ответы

Ответ 1



%5B%5D - это ANSII код (если я не ошибся) символов "[]". нет, это не анси) и даже не ASCII, это урлкодированная строка ?serv%5B%5D=1 Это, абсолютно правильная урлкодированная строка Как, не меняя логики формы, отобразить в адресной строке не mysite.ru/?serv%5B%5D=1, а mysite.ru/?serv[]=1 никак, ваши формы работают корректно, именно так как и должны работать. https://ru.wikipedia.org/wiki/URL Прочтите раздел "Кодирование URL"

воскресенье, 26 января 2020 г.

Невидимые параметры в fiddler или почему мой запрос не проходит? [закрыт]

#c_sharp #http #get


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Проблема для меня магическая. Задача - пройти авторизацию на сайте ru.wix.com. Для
этого нужно получить определенные куки, отправив определенный запрос. Работаю из приложения
на c# с помощью библиотеки xNet. Так вот, проблема в том, что делая запрос из приложения(как
через fiddler, так и напрямую), мой запрос не проходит, куки не выдаются и загружаются
другие данные. 
Но стоит мне повторить тот же самый запрос(!) из fiddler'а(хот-кей "R" или "Reissue
Requests"), как он спокойно проходит, выдаются куки и загружается нужный контент. Этому
есть какое-то объяснение?

UPD: Заметил, что если повторять запрос с частотой 1сек - то проходит ровно на 5й
раз, если с частотой в 2 - то где-то на третий. При этом одиночная пауза в 3-4-5-6сек
не подходит, все равно нужно повторять. В браузере и через fiddler проходит все с 1го раза.

UPD2:: Попробовал через WebRequest - тоже самое. При этом, если формировать те же
самые запросы от начала и до конца с помощью Composer fiddler'a, проходит на ура. Очень
прошу помощи.
    


Ответы

Ответ 1



Проверь редиректы. .net'овский запрос по умолчанию сам обрабатывает редирект, поэтому если куки были выставлены в ответе, где делается редирект, то ты их пропустил и получил уже следующую страницу (запрошенную без этих кук). Попробуй отключить автоматическую обработку редиректа, достать всё необходимое из ответа и выполнить дальнейшие действия вручную. Кстати, там, где я действовал таким образом, я вообще не запрашивал страницу, на которую сделан редирект - я просто вытаскивал куки и слал следующий нужный мне запрос.

Ответ 2



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

В ответе на GET запрос получаю не полный HTML код

#java #html #http #get


Пытаюсь получить HTML код со страницы своего приложения в Однокласстиках, в котором
есть session_key. Но большого куска кода в котором он присутствует почему то в ответе
нет. Не знаю в чем может быть проблема? При авторизации через браузер данный код присутствует.

public static HttpClient getThreadSafeClient(HttpClient client)  {

    client = new DefaultHttpClient();
    ClientConnectionManager mgr = client.getConnectionManager();
    HttpParams params = client.getParams();
    client = new DefaultHttpClient(new ThreadSafeClientConnManager(params,

            mgr.getSchemeRegistry()), params);
    return client;
}

private static String getHtmlOK (){


    HttpClient httpClient = new DefaultHttpClient();
    org.apache.http.client.CookieStore cookieStore = new BasicCookieStore();
    HttpContext context = new BasicHttpContext();
    context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    HttpPost httpPost = new HttpPost("https://www.ok.ru/https");

    List nameValuePairList = new ArrayList(2);
    nameValuePairList.add(new BasicNameValuePair("st.redirect", ""));
    nameValuePairList.add(new BasicNameValuePair("st.asr", ""));
    nameValuePairList.add(new BasicNameValuePair("st.posted", "set"));
    nameValuePairList.add(new BasicNameValuePair("st.originalaction", "http://ok.ru/dk?cmd=AnonymLogin&st.cmd=anonymLogin"));
    nameValuePairList.add(new BasicNameValuePair("st.fJS", "on"));
    nameValuePairList.add(new BasicNameValuePair("st.st.screenSize", "1366 x 768"));
    nameValuePairList.add(new BasicNameValuePair("st.st.browserSize", "628"));
    nameValuePairList.add(new BasicNameValuePair("st.st.flashVer", "18.0.0"));
    nameValuePairList.add(new BasicNameValuePair("st.email", "login"));
    nameValuePairList.add(new BasicNameValuePair("st.password", "password"));
    nameValuePairList.add(new BasicNameValuePair("st.iscode", "false"));

    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();
    String line = null;
    String newline = System.getProperty("line.separator");
    try {
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList));
        HttpResponse response = httpClient.execute(httpPost, context);
        Header locetionHeader = response.getFirstHeader("location");


        httpClient = getThreadSafeClient(httpClient);

        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) {
            // Выводим страницу на экран
            String locetion;
            if (locetionHeader != null){
                locetion = locetionHeader.getValue();
                HttpGet httpGet = new HttpGet(locetion);

                response = httpClient.execute(httpGet, context);

                httpGet = new HttpGet("http://ok.ru/game/1146333440");


                httpClient = getThreadSafeClient(httpClient);

                response = httpClient.execute(httpGet, context);

                br = new BufferedReader(new InputStreamReader(
                        response.getEntity().getContent()));

                while (((line = br.readLine()) != null)) {
                    sb.append(line);
                    sb.append(newline);
                }
            }


        } else {
            System.out.println("А страничка-то и не загрузилась!!!");
            System.out.println(locetionHeader.getValue());

        }
    }
    catch (IOException e){
        System.out.println("Проблемы со связью");
    }
System.out.println(sb);
    return sb.toString();
}

    


Ответы

Ответ 1



Очень часто вывод тормозят escape-символы, кавычки итд. У меня было подобное. тормозил BOM. Сравните коды, из браузера и в буфере, может в символ уперся.

пятница, 24 января 2020 г.

Как преобразовать ответ сервера в изображение

#c_sharp #post #get


Здравствуйте есть файл с ответом на get запрос в нем находится информация от сервера
и дальше через пустую строку набор символов, которое судя по всему является изображением.
Вопрос как мне файл этот преобразовать в jpeg изображение.
это файл с гет запросом!

GET /7212330m.png HTTP/1.1
Host: savepic.org
Connection: keep-alive
Accept: image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/43.0.2357.172 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Range: bytes=57180-57180
If-Range: Sun, 03 May 2015 14:44:13 GMT


а это файл с ответом на него:


  HTTP/1.1 206 Partial Content Server: nginx/1.0.15 Date: Wed, 05 Oct
  2016 10:40:32 GMT Content-Type: image/jpeg Content-Length: 1
  Last-Modified: Sun, 03 May 2015 14:44:13 GMT Connection: keep-alive
  Content-Range: bytes 57180-57180/180675
  
  UHTTP/1.1 206 Partial Content Server: nginx/1.0.15 Date: Wed, 05 Oct
  2016 10:40:33 GMT Content-Type: image/jpeg Content-Length: 123495
  Last-Modified: Sun, 03 May 2015 14:44:13 GMT Connection: keep-alive
  Content-Range: bytes 57180-180674/180675
  
  UґыГ8r~q!AnзПёzчv·µмbIЅ\2Ћ’Jj'™GЁJ'$:;љ•U"Бk}Я‹к±И)Љ\"ЅЈтq·


и так далее 
    


Ответы

Ответ 1



Если не применялось специальных методов кодирования (проверьте заголовки Content-Encoding и Transport-Encoding) - то достаточно обрезать заголовки. Следите за окончаниями строк - нельзя позволять выбранному инструменту их заменять на "нужные". Проверить, как ведет себя ваш инструмент с окончаниями строк можно открыв файл с запросом и сразу же сохранив обратно. Размер файла не должен поменяться. Также обратите внимание на заголовок запроса Range и заголовок ответа Content-Range. Ваш файл загружался по частям. PS как вы получили файл с "сырым" запросом? Если у вас есть возможность повторить эксперимент, я бы советовал использовать fiddler для просмотра запросов.

Ответ 2



Если полученный текст действительно изображение, то такой код конвертирует его public Image imageFromByte(byte[] byteArrayIn) { MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); return returnImage; } А дальше уже можно сохранить её в нужном формате

среда, 22 января 2020 г.

Обработка GET-запросов на python: сохранить значение из одного запроса и отдать в другом

#python #get #cgi #esp8266


Добрый день! Написал (точнее скопипастил) такой сервер:

from http.server import HTTPServer, CGIHTTPRequestHandler
import time

server_address = ('192.168.0.198', 800)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
begin_time = time.asctime()
print('Server started on', begin_time)
print('Server is running on address', server_address[0], 'on port', server_address[1])
httpd.serve_forever()


Он принимает данные (GET-запрос) с платы ESP8266. Эти данные в консоли отображаются,
но вот нормально их обработать не могу (хочу выводить на отдельной странице).

Что посоветуете?

UPD. С точки зрения пользователя должно быть так: зашел на 192.168.0.198:800/...
и увидел окошко со значением температуры (её я и получаю get-запросом). На этом же
адресе запущен сервер.
    


Ответы

Ответ 1



микроконтроллер с датчиком температуры отправляет показания методом get Чтобы создать http-сервер, который записывает температуру, полученную в GET запросе от микроконтроллера, и показывает её позже в последующих запросах, можно использовать bottle библиотеку: #!/usr/bin/env python from bottle import route, request, run, template # $ pip install bottle temperature = None @route('/') def index(): global temperature temperature = request.query.temperature or temperature return template('Temperature: {{temperature}}', temperature=temperature) run(host='localhost', port=8000) При запуске этого Питон-скрипта, запускается http-cервер, который слушает на локальной машине на 8000 порту. При получении GET-запроса, содержащего temperature параметр, глобальная переменная temperature обновляется и тут же показывается как html. Если temperature параметр не указан, то возвращается предыдущее значение или None, если ещё ни разу не был temperature параметр задан. То есть ожидается, что часть читающая температуру с датчика выполняет запросы типа: $ http ':8000?temperature=20' что устанавливает значение (20). Чтобы прочитать это значение, достаточно не указывать параметр: $ http :8000 Можно в браузере посмотреть (тот же запрос): $ python -mwebbrowser http://localhost:8000 http команду можно получить, установив httpie библиотеку: $ pip install httpie Обычно вместо использования глобальных переменных используется база данных (что позволяет сохранять значение температуры между запусками серверного процесса или его экземплярами в разных процессах). В простейшем случае, простой плоский текстовый файл может использован. Вот пример c sqlite. Если не хочется ставить bottle с помощью команды (предпочтительно внутри virtualenv): $ pip install bottle то достаточно скачать bottle.py и положить его рядом с кодом сервера.

Как очистить $_POST, $_GET? Реализация функции отсечения случайной множественной отправки формы.

#forms #post #php #get



В заголовке, просьба, ключевики не править: именно по ним ищут эту функцию 99% людей.
Часто отвечал, что для контроля отправки надо прописывать айдишник сабмита. И вот
что я имел ввиду(решение готовое. Можно брать и юзать):

Проверка:
function accidently_submit_check(){
    if(!isset($_POST['submit_id'])){
        //unknown submission attempt or no post data
        return false;
    }
    if(!isset($_SESSION['submit_id'][$_POST['submit_id']])){
        //unknown submission attempt
        return false;
    }
    if($_SESSION['submit_id'][$_POST['submit_id']]){
        //form was already submitted
        return false;
    }
    return true;
}

В функции обработки формы, если все нормально:
$_SESSION['submit_id'][$_POST['submit_id']] = true;

В функции генерации формы:
$form['SUBMIT_ID']['value'] = md5(microtime(true).$_SESSION['user']['id']);
$_SESSION['submit_id'][$form['SUBMIT_ID']['value']] = false;

printf('',$form['SUBMIT_ID']['value']);

Внимание, вопрос: что я упустил?
Все работает, но мало ли.    


Ответы

Ответ 1



Ну, содержание первой части заголовка вопроса не совсем соответствует самому вопросу. Очистка $_GET, $_POST производится через header('Location: {referer}'); А то что у вас - немного другое. Вот ещё вариант:


воскресенье, 12 января 2020 г.

Работа с HttpURLConnection в Android, полечение информации по GET

#java #android #http #get #httpurlconnection


Нужно получить результат GET запроса в Android и вернуть значение из метода.
Решено! Всем спасибо за участие!

public void sayHello(View view)throws IOException {
        Thread httpThread = new Thread(new Runnable() {
            public void run() {
                String mybla = sendGet();
            }
        });
        httpThread.start();
    }
private String sendGet(){
        try{
            String mystr = "http://www.pravda.com.ua";
            URL obj = new URL(mystr);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("User-Agent", "Mozilla/5.0");
            con.setRequestProperty("Accept-Charset", "UTF-8");
            InputStream response = con.getInputStream();
            Scanner s = new Scanner(response).useDelimiter("\\A");
            String result = s.hasNext() ? s.next() : "";
            return result;
        }
        catch (Exception e) {
            return e.toString();
        }
    }

    


Ответы

Ответ 1



Все делаете правильно. Для того, чтобы прочитать поток и получить из него String, можете воспользоваться, например, библиотекой Apache commons IOUtils (офф. сайт). С её помощью: String result = IOUtils.toString(inputStream); Если предпочетаете способ без сторонних библиотек (что я приветствую, потому что это позволяет узнать что-то новое о языке, в котором вы новичек), то делайте например так: Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; UPD: Заверните в new Thread(new Runnable() { public void run() { //вызовите ваш код для сетевого запроса } }).start(); Когда ваш запрос вернул результат внутри вашего Thread, чтобы поменять элемент интерфейса вам понадобится сделать это из UI-потока. Для этого используйте Context.runOnUiThread();.

Ответ 2



Код с использованием либы OkHttp OkHttpClient client = new OkHttpClient.Builder().build(); String url = ...; Request.Builder request = new Request.Builder(); request.url(url); request.get(); Response response = client.newCall(request.build()).execute(); String response = response.body().string(); System.out.println(response ); Надо помнить, что на андроид запросы в сеть можно с API14 делать только вне UI потока. Например через AsynkTask, Thread etc

четверг, 9 января 2020 г.

Get-запрос. Ошибка "Сервер нарушил протокол. Section=ResponseStatusLine

#c_sharp #get


Доброе время суток!
При вызове Get метода, catch(Exception ex) выводит ошибку "Сервер нарушил протокол.
Section=ResponseStatusLine.

код на клиенте Метод get-запроса:

  public String URL = "http://192.168.16.254:8080/blinkSs";
    string r = "";
    private string GET(string sUrl, string Data)
    {

        System.Net.WebRequest req = System.Net.WebRequest.Create(sUrl + "?" + Data);
        System.Net.WebResponse resp = req.GetResponse();
        System.IO.Stream stream = resp.GetResponseStream();
        System.IO.StreamReader sr = new System.IO.StreamReader(stream);
        string Out = sr.ReadToEnd();
        sr.Close();
        return Out;

    }


Вызываю метод GET вот так:

if (e.KeyCode == Keys.Up)
            {
                try
                {
                    r = "oske";
                    String a=GET(URL, r);
                    MessageBox.Show(a);
                }
                catch(Exception ex) {
                    MessageBox.Show("error" + " " + ex.Message);
                }
            }


код на сервере:

void setup() {     
  Serial.begin(115200);  
  pinMode(13, OUTPUT); //Rele 1
  //pinMode(12, OUTPUT);  //Rele 2
}
int f = 0;
String com_get = "";//
void loop() {
  boolean has_request = false;
  String in = "";
  if (Serial.available()) {
    in = "";
    while (true) {  // should add time out here
      while (Serial.available() == false) {}
      in += (char)(Serial.read());//тут хттп запрос, урл адресс
      if (in.endsWith("\r\n\r\n")) {//если первая строка (string) завершается символом,
содержащимся в строке string2
        has_request = true;  break;
      }
    }   
  }
  if (has_request) {
    int i1 = in.indexOf("GET /blinkSs?"), i2;//13 символов
    if (i1 != -1) {
      i2 = in.indexOf(" ", i1+13);//кол. символов с 13ого
      f = in.substring(i1+13, i2).toInt();//запрос
      com_get=in.substring(i1+13, i2);
    }      


    //Serial.println("HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close");
     //String sr = "";
     //Serial.println(sr);
    // Serial.println("");
     //Serial.println("");
     //Serial.println("");
     //Serial.println("");
    if (com_get=="oske") {f=1; Serial.println("Comando 1. oske"); } //↑
    if (com_get=="aska") {f=2; Serial.println("Comando 2. aska"); }//↓
    if (com_get=="kren_unga") {f=3; Serial.println("Comando 3. kren_unga"); }// /
    if (com_get=="kren_sulga") {f=1; Serial.println("Comando 1. kren_sulga"); }// \

   //Serial.println("");
   //Serial.println("\n");
    has_request = false;
  }
switch (f){
  case 1:
   digitalWrite(13, HIGH);
   break;
  case 2:
   digitalWrite(13, LOW);
   break;  
   f=0;
   Serial.end();

}  

}

    


Ответы

Ответ 1



В файл app.config добавьте Задание этого свойства игнорирует ошибки проверки, возникающие при анализе HTTP.

Ответ 2



Очевидно же, что ты на сервере код состояния Status-Line не отправляешь. Изучи RFC https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html Response = Status-Line ; Section 6.1 *(( general-header ; Section 4.5 | response-header ; Section 6.2 | entity-header ) CRLF) ; Section 7.1 CRLF [ message-body ] ; Section 7.

суббота, 28 декабря 2019 г.

javascript получить GET параметр

#javascript #get


Нужно получить из урл значение get параметра "data", каким образом это можно реализовать?
    


Ответы

Ответ 1



Свойство window.location содержит объект со свойством search – строка, начиная со знака вопроса. Напр., адрес https://site.com/script?param=val&data=ololo и JS код: var strGET = window.location.search.replace( '?', ''); // в переменной strGET будет строка "param=val&data=ololo" Дальше разбить по символу & и по знакам =. Также пригодится ф-я decodeURIComponent() для декодирования из urlencode значения параметра. Полное решение по получению всех GET-параметров в JavaScript может быть таким: var params = window .location .search .replace('?','') .split('&') .reduce( function(p,e){ var a = e.split('='); p[ decodeURIComponent(a[0])] = decodeURIComponent(a[1]); return p; }, {} ); console.log( params['data']); // выведет в консоль значение GET-параметра data

Ответ 2



Если я правильно понял, что вы хотите сделать var params = {}; if (window.location.href.match(/.*\?.*/)) { for (var i = 0; i < tmp_params.length; i++) { var _tmp = window.location.href.replace(/.*\?/,'') .split('&')[i] .split('='); params[_tmp[0]] = _tmp[1]; } } alert(params.data);

Ответ 3



location.href позволяет получить текущий адрес страницы. Чтобы получить параметр, можно применить регулярное выражение, либо использовать такой хак: var parser = document.createElement('a'); parser.href = location.href; Будут доступны некоторые свойства, например, parser.protocol, parser.hostname, parser.search и подобные. Также наверняка есть библиотеки для удобной работы с URI.

пятница, 12 июля 2019 г.

Как на c# отправить GET или POST запрос, используя из параметров только url и raw(тело запроса)?

Если отправлять запросы через HttpWebRequest - нужно отдельно вводить нужные параметры "Host", "KeepAlive", "UserAgent"..... таких заголовком может быть >15.
И при выполнении HttpWebRequest все эти заголовки(параметры) идут не всегда в нужной последовательности, а часть может вообще пропускаться.
Можно ли отправить GET или POST запрос, указав вместо всех этих всех параметров(заголовков) именно сам RAW запроса? С нужным мне порядком заголовком. И именно таким, каким я его хочу видеть.


Ответ

Вы можете использовать более низкоуровневые классы и посылать все, что хотите:
var client = new TcpClient("host", 80); var stream = client.GetStream();
Если соединение по TLS:
var client = new TcpClient("host", 443); var stream = new SslStream(client.GetStream());
И дальше отправляем что-то:
string request = "GET /folder/1.html HTTP/1.0" + Environment.NewLine + "Host: " + "host" + Environment.NewLine + "Your-header: " + "value" + Environment.NewLine + Environment.NewLine; // или вы можете взять raw байты заголовка откуда-то еще // если есть имя ресурса и raw заголовки, нужно будет склеить байты первой строки с "GET/POST" и байты заголовоков // (не забыв что в конце должен быть перенос строки 2 раза) byte[] requestBytes = Encoding.ASCII.GetBytes(request); stream.Write(requestBytes, 0, requestBytes.Length);
И читаем ответ:
var reader = new StreamReader(stream, Encoding.UTF8); // подставьте сюда нужную кодировку var response = sr.ReadToEnd(); // здесь будут и заголовки и тело // закрываем стрим и TcpClient
Но заголовки ответа придется парсить самому.

вторник, 9 июля 2019 г.

Отправляю GET запрос, сервер отвечает 404 “Тело ответа будет пустым.” Что нужно сделать чтоб это указать [закрыт]

import com.google.gson.Gson; import java.io.IOException; import java.io.UnsupportedEncodingException;

import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.StringEntity;
/** * * @author Ewrei *///Ошибка class ErrorObj { long code; String message; } //Отправка телефона class pojo1 { int id;
public void setId(int p) { id = p; } //generate setter and getters }
public class PovtornayOtpravka {
public static HttpClient verifiedClient(HttpClient base) { try { SSLContext ctx = SSLContext.getInstance("SSL"); X509TrustManager tm = new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} };
ctx.init(null, new TrustManager[] { tm }, null); SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ClientConnectionManager mgr = base.getConnectionManager(); SchemeRegistry registry = mgr.getSchemeRegistry(); registry.register(new Scheme("https", 443, ssf)); return new DefaultHttpClient(mgr, base.getParams()); } catch (Exception ex) { ex.printStackTrace(); return null; } }
public static void main(String[] args) throws UnsupportedEncodingException, IOException { pojo1 poj = new pojo1(); poj.setId(159184727); Gson gson2 = new Gson(); StringEntity postingString = new StringEntity(gson2.toJson(poj));
String url = "https://protaxi-brest.hivelogin.ru:443/api/client/mobile/1.0/registration/resubmit&id=" + poj.id;
HttpClient client = new DefaultHttpClient(); client = verifiedClient(client); HttpGet post = new HttpGet(url);
HttpResponse response = client.execute(post);
//final GitPolz polz = gson.fromJson(response.getEntity().(), GitPolz.class); System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
//String httpResponse = EntityUtils.toString(response.getEntity()); }
}


Ответ

String url = "https://protaxi-brest.hivelogin.ru:443/api/client/mobile/1.0/registration/resubmit&id=" + poj.id;
Вы некорректно передаёте параметр.
Строка параметров должна отделяться от пути запроса вопросительным знаком:
http://example.org/path?param=value¶m2=value2
Попробуйте так:
String url = "https://protaxi-brest.hivelogin.ru:443/api/client/mobile/1.0/registration/resubmit?id=" + poj.id;

воскресенье, 7 июля 2019 г.

Выполнить сортировку html таблицы до получения html кода

Получаю данные по этой ссылке. Код на python. Также использую библиотеку BeautifulSoup для последующей обработки HTML кода.
Как мне, перед получением HTML кода страницы, выполнить сортировку таблицы на сайте, например по цене?
url = 'https://coinmarketcap.com/currencies/bitcoin/#markets' html = requests.get(url).text data = get_data(html)


Ответ

Можно воспользоваться модулем Pandas
import pandas as pd
url = 'https://coinmarketcap.com/currencies/bitcoin/#markets' df = pd.read_html(url)[0]
res = (df.assign(pr_num=lambda x: pd.to_numeric(x['Price'].str.replace(r'[\$,\s\*]',''), errors='coerce')) .sort_values('pr_num', ascending=False))
результат:
In [268]: print(res) # Source Pair Volume (24h) Price Volume (%) Updated pr_num 353 354 CoinExchange CUBE/BTC $1,568,170 $13064.30 0.03% Recently 13064.30 13 14 BTCC BTC/USD $58,216,900 $7630.00 1.25% Recently 7630.00 224 225 LakeBTC BTC/USD $3,144,690 $7144.04 0.07% Recently 7144.04 251 252 Bitinka BTC/ARS $2,599,470 $7087.53 0.06% Recently 7087.53 170 171 BCEX NAS/BTC $4,433,300 $7057.71 0.09% Recently 7057.71 .. ... ... ... ... ... ... ... ... 280 281 Bit-Z XAS/BTC $2,230,820 $6297.18 0.05% Recently 6297.18 279 280 BtcTrade.im ETC/BTC $2,270,590 $6287.73 0.05% Recently 6287.73 291 292 OKEx OF/BTC $2,112,840 $6278.22 0.05% Recently 6278.22 369 370 Hotbit BZNT/BTC $1,453,500 $6272.91 0.03% Recently 6272.91 193 194 BCEX ANS/BTC $3,664,540 $5950.85 0.08% Recently 5950.85
[400 rows x 8 columns]
если нужен HTML:
res.to_html(r'c:/temp/res.html')
результат для первых 10 строк:

# Source Pair Volume (24h) Price Volume (%) Updated pr_num
353 354 CoinExchange CUBE/BTC $1,568,170 $13064.30 0.03% Recently 13064.30
13 14 BTCC BTC/USD $58,216,900 $7630.00 1.25% Recently 7630.00
224 225 LakeBTC BTC/USD $3,144,690 $7144.04 0.07% Recently 7144.04
251 252 Bitinka BTC/ARS $2,599,470 $7087.53 0.06% Recently 7087.53
170 171 BCEX NAS/BTC $4,433,300 $7057.71 0.09% Recently 7057.71
223 224 BtcTrade.im LTC/BTC $3,146,020 $7044.13 0.07% Recently 7044.13
146 147 Bit-Z GXS/BTC $5,608,050 $6958.11 0.12% Recently 6958.11
385 386 LBank PNT/BTC $1,385,290 $6904.87 0.03% Recently 6904.87
264 265 Negocie Coins BTC/BRL $2,487,080 $6898.36 0.05% Recently 6898.36
387 388 Trade By Trade DASH/BTC $1,378,990 $6894.70 0.03% Recently 6894.70

PS чтобы удалить созданный столбец pr_num
res = res.drop('pr_num', axis=1)
In [272]: res Out[272]: # Source Pair Volume (24h) Price Volume (%) Updated 353 354 CoinExchange CUBE/BTC $1,568,170 $13064.30 0.03% Recently 13 14 BTCC BTC/USD $58,216,900 $7630.00 1.25% Recently 224 225 LakeBTC BTC/USD $3,144,690 $7144.04 0.07% Recently 251 252 Bitinka BTC/ARS $2,599,470 $7087.53 0.06% Recently 170 171 BCEX NAS/BTC $4,433,300 $7057.71 0.09% Recently .. ... ... ... ... ... ... ... 280 281 Bit-Z XAS/BTC $2,230,820 $6297.18 0.05% Recently 279 280 BtcTrade.im ETC/BTC $2,270,590 $6287.73 0.05% Recently 291 292 OKEx OF/BTC $2,112,840 $6278.22 0.05% Recently 369 370 Hotbit BZNT/BTC $1,453,500 $6272.91 0.03% Recently 193 194 BCEX ANS/BTC $3,664,540 $5950.85 0.08% Recently
[400 rows x 7 columns]

среда, 13 марта 2019 г.

Обработка GET-запросов на python: сохранить значение из одного запроса и отдать в другом

Добрый день! Написал (точнее скопипастил) такой сервер:
from http.server import HTTPServer, CGIHTTPRequestHandler import time
server_address = ('192.168.0.198', 800) httpd = HTTPServer(server_address, CGIHTTPRequestHandler) begin_time = time.asctime() print('Server started on', begin_time) print('Server is running on address', server_address[0], 'on port', server_address[1]) httpd.serve_forever()
Он принимает данные (GET-запрос) с платы ESP8266. Эти данные в консоли отображаются, но вот нормально их обработать не могу (хочу выводить на отдельной странице).
Что посоветуете?
UPD. С точки зрения пользователя должно быть так: зашел на 192.168.0.198:800/... и увидел окошко со значением температуры (её я и получаю get-запросом). На этом же адресе запущен сервер.


Ответ

микроконтроллер с датчиком температуры отправляет показания методом get
Чтобы создать http-сервер, который записывает температуру, полученную в GET запросе от микроконтроллера, и показывает её позже в последующих запросах, можно использовать bottle библиотеку
#!/usr/bin/env python from bottle import route, request, run, template # $ pip install bottle
temperature = None
@route('/') def index(): global temperature temperature = request.query.temperature or temperature return template('Temperature: {{temperature}}', temperature=temperature)
run(host='localhost', port=8000)
При запуске этого Питон-скрипта, запускается http-cервер, который слушает на локальной машине на 8000 порту.
При получении GET-запроса, содержащего temperature параметр, глобальная переменная temperature обновляется и тут же показывается как html. Если temperature параметр не указан, то возвращается предыдущее значение или None, если ещё ни разу не был temperature параметр задан.
То есть ожидается, что часть читающая температуру с датчика выполняет запросы типа:
$ http ':8000?temperature=20'
что устанавливает значение (20).
Чтобы прочитать это значение, достаточно не указывать параметр:
$ http :8000
Можно в браузере посмотреть (тот же запрос):
$ python -mwebbrowser http://localhost:8000
http команду можно получить, установив httpie библиотеку
$ pip install httpie

Обычно вместо использования глобальных переменных используется база данных (что позволяет сохранять значение температуры между запусками серверного процесса или его экземплярами в разных процессах). В простейшем случае, простой плоский текстовый файл может использован. Вот пример c sqlite
Если не хочется ставить bottle с помощью команды (предпочтительно внутри virtualenv):
$ pip install bottle
то достаточно скачать bottle.py и положить его рядом с кодом сервера.

среда, 6 марта 2019 г.

Работа с HttpURLConnection в Android, полечение информации по GET

Нужно получить результат GET запроса в Android и вернуть значение из метода. Решено! Всем спасибо за участие!
public void sayHello(View view)throws IOException { Thread httpThread = new Thread(new Runnable() { public void run() { String mybla = sendGet(); } }); httpThread.start(); } private String sendGet(){ try{ String mystr = "http://www.pravda.com.ua"; URL obj = new URL(mystr); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", "Mozilla/5.0"); con.setRequestProperty("Accept-Charset", "UTF-8"); InputStream response = con.getInputStream(); Scanner s = new Scanner(response).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; return result; } catch (Exception e) { return e.toString(); } }


Ответ

Все делаете правильно. Для того, чтобы прочитать поток и получить из него String, можете воспользоваться, например, библиотекой Apache commons IOUtils (офф. сайт). С её помощью:
String result = IOUtils.toString(inputStream);
Если предпочетаете способ без сторонних библиотек (что я приветствую, потому что это позволяет узнать что-то новое о языке, в котором вы новичек), то делайте например так:
Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : "";
UPD
Заверните в
new Thread(new Runnable() { public void run() { //вызовите ваш код для сетевого запроса } }).start();
Когда ваш запрос вернул результат внутри вашего Thread, чтобы поменять элемент интерфейса вам понадобится сделать это из UI-потока. Для этого используйте Context.runOnUiThread();