LINUX.ORG.RU

[elisp][url]Обработка результата запроса

 ,


0

0

Есть некий поддерживающий RPC сервер, с помощью url-retrieve отправляю запрос, создаётся новый буфер и кидает туда ответ на запрос.

Теперь есть желание поработать с этим результатом запроса

Внимание, вопрос: Можно ли с помощью пакета url (например) получить этот результат не в виде содержимого буфера, а в каком-либо ином? Хотя бы хедер отделить от содержания?


Можно ли с помощью пакета url (например) получить этот результат не в виде содержимого буфера, а в каком-либо ином?

Чё?

Хотя бы хедер отделить от содержания?

Можно вручную твой response-buffer обработать и возвратить строчку с телом ответа, например:

(with-current-buffer response-buffer
  (goto-char (point-min))
  (when (looking-at "^HTTP/1.* \\(200 OK\\|500 Internal Server Error\\)$")
    (re-search-forward "^$" nil t 1)
    (buffer-substring-no-properties (point) (point-max))))

А можно еще Emacs MIME воспользоваться:

(require 'mm-decode)

(with-current-buffer response-buffer
  (with-current-buffer (mm-handle-buffer (mm-dissect-buffer t))
    (buffer-string)))

Не проверял.

Zubok ★★★★★
()

Сам подумай, сервер может тебе разную информацию в хидере возвращать. На сервере может быть ошибка, он тебе в хидере об этом напишет, а ты не анализируешь его. В итоге твоя программа пойдет не тем путем.

http://www.w3.org/Protocols/HTTP/HTRESP.html

Zubok ★★★★★
()

>Есть некий поддерживающий RPC сервер, с помощью url-retrieve отправляю запрос, создаётся новый буфер и кидает туда ответ на запрос.

Если интересно, то этот код я у себя надергал из самопальной библиотеки SOAP (тот же RPC). Просто я под твои условия несколько его подправил, поэтому работоспособность конкретно этого кода в ответе не проверялась.

Я анализирую только коды 200 или 500, так как только они прописаны в стандарте.

Zubok ★★★★★
()

Вот еще в документацию можешь глянуть.

HTTP URLs are retrieved into a buffer containing the HTTP headers
followed by the body.  Since the headers are quasi-MIME, they may be
processed using the MIME library.  See Emacs MIME: (emacs-mime).
The URL package provides a function to do this in general:

 -- Function: url-decode-text-part handle &optional coding
     This function decodes charset-encoded text in the current buffer.
     In Emacs, the buffer is expected to be unibyte initially and is
     set to multibyte after decoding.  HANDLE is the MIME handle of the
     original part.  CODING is an explicit coding to use, overriding
     what the MIME headers specify.  The coding system used for the
     decoding is returned.

     Note that this function doesn't deal with `http-equiv' charset
     specifications in HTML `<meta>' elements.
Zubok ★★★★★
()

Еще url-insert есть в Emacs 23. В 22-м у меня ее нет. Она как раз через Emacs MIME реализована.

Zubok ★★★★★
()

Внимание, вопрос: Можно ли с помощью пакета url (например) получить этот результат не в виде содержимого буфера, а в каком-либо ином?

Ну и тут не совсем понятно, что имеется в виду. Если ответ — это XML, то просто сделай (require 'xml), а потом долбани плюхалкой по кувыкалке при помощи xml-parse-region, например:

(with-current-buffer response-buffer
   (with-current-buffer (mm-handle-buffer (mm-dissect-buffer t))
      (xml-parse-region (point-min) (point-max) nil nil t)))

Получишь список вида:

((node1 ((attr1 . value1) (attr2 . value2) ...) children) (node2...))

Можно выбрать либо парсинг с префиксами, либо без них.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

огромное спасибо за инфорацию, будем пробовать

ответ сервера состоит из http хидеров - Content-type, content-length итп, потом двойной перевод строки (наверное от этого нужно плясать) потом html либо json (указывается в content-type) в зависимости от результата запроса.

mitol
() автор топика
Ответ на: комментарий от mitol

(mm-handle-type...) вернет Content-type. Этой функции надо скормить handle, который возвратит mm-dissect-buffer.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.