Есть ли программа в стиле "терминала", которая разговаривает с сервером по http?

Что мы можем сделать, так это переместить столбцы в строки с помощью утилиты rs из BSD Unix, а затем просто sort строки (таким образом, эффективно сортируя столбцы исходных данных), а затем снова транспонировать.

Во-первых, обратите внимание, что в алфавитном порядке это: адрес, номер мобильного телефона, имя. M стоит перед N!

Шаг за шагом:

$ cat data
name  ,adress  ,mobile-number
Ane   ,USA     ,12121212
Joane ,England ,234234

$ rs -s, -C, -T < data
name  ,Ane   ,Joane ,
adress  ,USA     ,England ,
mobile-number,12121212,234234,

$ rs -s, -C, -T < data | sort
adress  ,USA     ,England ,
mobile-number,12121212,234234,
name  ,Ane   ,Joane ,

$ rs -s, -C, -T < data | sort | rs -s, -C, -T
adress  ,mobile-number,name  ,
USA     ,12121212,Ane   ,
England ,234234,Joane ,

$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T
adress         mobile-number  name  
USA            12121212       Ane   
England        234234         Joane 

Наконец:

$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T | sed -e 's/ \([^ ]\)/,\1/g'
adress        ,mobile-number ,name  
USA           ,12121212      ,Ane   
England       ,234234        ,Joane 

Я сделал это в Ubuntu GNU / Linux, и сначала мне пришлось sudo apt-get install rs .

2
16.09.2016, 18:32
4 ответа

Хорошо.

Вдохновленный ответом @drewbenn, я сам написал его на Python, используя библиотеку Requests ( http://requests.readthedocs.io/en/master/ ):

import requests
import sys

url = sys.argv[1]
print "Connecting ", url

r = requests.get(url)
print r.text
flag = True
while flag :
    s = raw_input()
    data = {"opt": s}
    r = requests.get(url, params=data)
    print r.text
1
27.01.2020, 21:52

Вы можете использовать telnet для подключения к серверу. , зная, что ( здесь я предполагаю, что вы хотите использовать веб-сервер для связи) вам нужно будет действовать в рамках ограничений спецификации HTTP.
Например, спецификация https://www.w3.org/Protocols/rfc2616/rfc2616.txt
гласит:

Исходные серверы ДОЛЖНЫ включать поле заголовка даты во всех ответы, за исключением этих случаев: ...

вот конечный результат "разговора", который у меня был с веб-сервером по telnet.
Принимая во внимание, что конфигурация веб-серверов будет определять, как долго TCP-соединение будет оставаться активным, т. Е. Время, которое вам нужно ввести правильно сформированный HTTP-запрос, прежде чем сервер разорвет TCP-соединение из-за " бездействие ". но это можно настроить.
Если вы вводите каждый запрос до тайм-аута, вы, по сути, будете отправлять множество HTTP-запросов и ответов через одно непрерывное TCP-соединение.

% telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1           <---- this in where you type characters "interactively"            
Host: localhost          <---- this in where you type characters "interactively"
                         <-- per the HTTP specification this has to be an emtpy line
                             to tell the server you are done with your "message"



HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:38:08 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive

45d
<html>
[truncated ... ]
</html>


0                      

GET / HTTP/1.1         <-- now you are back at prompt
Host: localhost            Note: you need to enter the `Host` header if you are talking 
                           to a webserver
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:41:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive

45d
<html>
[truncated]

Очевидно, чтобы получить более чистый «диалог», вам нужно очистить вывод веб-сервера или вашего приложения, которое будет обрабатывать запросы.

nginx ttp_core_module отвечает за управление типом по умолчанию, используя
http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type

Чтобы добавить заголовки, вы можете используйте http_headers_module http://nginx.org/en/docs/http/ngx_http_headers_module.html

3
27.01.2020, 21:52

Если вы не против использования curl в качестве серверной части, и вам просто не нужно каждый раз вводить весь URL-адрес, вы можете запустить curl в цикле, что-то вроде этого:

read -p "Server name: " s && curl -fs "$s" && while true; do read -p "$ " x && curl -fs "$s?opt=${x^^}" || break; done

, который также хорошо вписался бы в псевдоним , если бы вы не хотели каждый раз вводить или вставлять все это целиком.

Здесь не так много проверки ошибок, что, вероятно, нормально, если вам просто нужен простой способ поговорить со своим собственным доверенным сервером, а не пытаться взломать собственный сценарий.Более продвинутый сценарий может проверить имя сервера или попытаться проанализировать возвращенные веб-страницы перед их отображением, и, конечно же, обе стороны должны защищаться от ненадежного ввода.

Я добавил два параметра в curl :

  • -f завершится с кодом ошибки 21 , если веб-страница вернет ошибку 400 или выше (полезно для команды quit )
  • -s тихий режим не отображает данные подключения для каждой команды.

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

2
27.01.2020, 21:52

Если это RESTful HTTP API, особенно разновидность HATEOAS, то вы можете использовать Spring rest-shell

https://github.com/spring-projects/rest-shell

Пример использования:

http://localhost:8080:> discover
rel                href
========================================================
address            http://localhost:8080/address
family             http://localhost:8080/family
people             http://localhost:8080/person
profile            http://localhost:8080/profile

http://localhost:8080:> follow people
http://localhost:8080/person:> list
rel             href
===================================================
people.Person    http://localhost:8080/person/1
people.Person    http://localhost:8080/person/2
people.search    http://localhost:8080/person/search

http://localhost:8080/person:> get 1
...
1
27.01.2020, 21:52

Теги

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