2015-04-13 2 views
4

Есть ли способ перехватить запрос ресурса и дать ему ответ непосредственно от обработчика? Что-то вроде этого:Запросы на перехват с пользовательскими ответами в PhantomJS?

page.onRequest(function(request){ 
    request.reply({data: 123}); 
}); 

Мой случай использования для использования PhantomJS, чтобы отобразить страницу, которая делает звонки на мой API. Чтобы избежать проблем с проверкой подлинности, я хотел бы перехватить все HTTP-запросы в API и вернуть ответы вручную, не делая фактического HTTP-запроса.

onResourceRequest почти делает это, но не имеет каких-либо возможностей модификации.

Возможности, которые я вижу:

  1. Я мог бы сохранить страницу как шаблон Рули и визуализации данных на страницу и передать его в качестве исходного HTML в PhantomJS (вместо URL). Хотя это сработает, это затруднит изменения, поскольку мне придется писать уровень данных для каждой веб-страницы, а веб-страницы не могут стоять в одиночестве.
  2. Я мог бы перенаправить на localhost и иметь там сервер, который будет слушать и отвечать на запросы. Это предполагает, что было бы хорошо иметь открытую, не аутентифицированную версию API на localhost.
  3. Добавить данные через page.evaluate на глобальный сайт window. У этого есть те же проблемы, что и # 1: мне нужно знать априорно, какие данные нужно странице, и написать код на стороне сервера, уникальный для каждой страницы.
+1

Вы правы, это невозможно с помощью PhantomJS. См. [Мой ответ здесь] (http://stackoverflow.com/a/24561614/1816580). Это для CasperJS, но также применяется и для PhantomJS. –

+0

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

ответ

0

Мне недавно нужно было сделать это при создании pdf-файлов с фантомными js. Немного взломанный, но, похоже, работает.

var page = require('webpage').create(), 
    server = require('webserver').create(), 
    totallyRandomPortnumber = 29522, 
    ... 
//in my actual code, totallyRandomPortnumber is created by a java application, 
//because phantomjs will report the port in use as '0' when listening to a random port 
//thereby preventing its reuse in page.onResourceRequested... 

server.listen(totallyRandomPortnumber, function(request, response) { 
    response.statusCode = 200; 
    response.setHeader('Content-Type', 'application/json;charset=UTF-8'); 
    response.write(JSON.stringify({data: 'somevalue'})); 
    response.close(); 
}); 

page.onResourceRequested = function(requestData, networkRequest) { 
    if(requestData.url.indexOf('interceptme') != -1) { 
     networkRequest.changeUrl('http://localhost:' + totallyRandomPortnumber); 
    } 
}; 

В моем реальном приложении я посылаю некоторые данные phantomjs для перезаписи запросов/ответов, так что я делаю больше проверок на URLs как в server.listen и page.onResourceRequested. Это похоже на перехватчик бедных, но он должен заставить вас (или кто бы это ни заботило) идти.

Смежные вопросы