2015-11-09 9 views
2

У меня есть приложение на основе Restlet, и я пытаюсь использовать ресурсы клиента Restlet для проверки определенных его частей.Состояние ресурса клиента-клиента «не изменено»

С момента обновления с Restlet 2.2.3 до 2.3.4 мои тесты проверки ETag начали сбой. Вот как я добавлял заголовок в старой версии:

Series<Header> headers = (Series<Header>) currentClientResource.getRequest().getAttributes().get("org.restlet.http.headers"); 
if (headers == null) { 
    headers = new Series<Header>(Header.class); 
} 
headers.add("If-None-Match", "\"" + eTag + "\""); 
currentClientResource.getRequestAttributes().put("org.restlet.http.headers", headers); 

Тогда при вызове представления() снова на обернутую clientResource я получаю 304 Not Modified ответа (который является то, что я хочу).

В 2.3.4 это привело к возврату 200 OK вместо этого, и я заметил сообщение журнала о том, что напрямую не задавать заголовок If-None-Match. Вместо этого я сейчас пытаюсь это:

currentClientResource.getRequest().getConditions().getNoneMatch().add(new Tag(eTag)); 

Однако это по-прежнему дает мне 200 OK. Если я сделаю запрос вручную через REST-клиент, я могу получить 304 Not Modified, поэтому сервер по-прежнему делает правильное поведение. Что мне нужно сделать в тестах, чтобы увидеть, что я хочу видеть?

+0

лишь несколько замечаний. Вы можете напрямую вызвать currentClientResource.getRequest(). GetHeaders(), если вы хотите добавить «дополнительные заголовки». Большинство заголовков доступны через API, что соответствует «If-None-match» (используя метод currentClientResource.getRequest(). GetConditions()). Мы рекомендуем использовать API вместо использования заголовков, потому что это может помочь переключиться на другой тип протокола. –

ответ

1

Я сделал попытку, и это работает для меня с версией 2.3.4 Restlet.

Вот что я сделал:

  • В Maven зависимостей для моего теста

    <project> 
        <modelVersion>4.0.0</modelVersion> 
        (...) 
    
        <properties> 
        <java-version>1.7</java-version> 
        <restlet-version>2.3.4</restlet-version> 
        </properties> 
    
        <dependencies> 
        <dependency> 
         <groupId>org.restlet.jse</groupId> 
         <artifactId>org.restlet</artifactId> 
         <version>${restlet-version}</version> 
        </dependency> 
    
        <dependency> 
         <groupId>org.restlet.jse</groupId> 
         <artifactId>org.restlet.ext.jetty</artifactId> 
         <version>${restlet-version}</version> 
        </dependency> 
    
        <dependency> 
         <groupId>org.restlet.jse</groupId> 
         <artifactId>org.restlet.ext.jackson</artifactId> 
         <version>${restlet-version}</version> 
        </dependency> 
    
        <dependency> 
         <groupId>org.restlet.jse</groupId> 
         <artifactId>org.restlet.ext.crypto</artifactId> 
         <version>${restlet-version}</version> 
        </dependency> 
        </dependencies> 
    
        <repositories> 
        <repository> 
         <id>maven-restlet</id> 
         <name>Public online Restlet repository</name> 
         <url>http://maven.restlet.com</url> 
        </repository> 
        </repositories> 
    </project> 
    
  • Ресурссервер, который устанавливает ETag на возвращенном представлении:

    public class ETagServerResource extends ServerResource { 
        @Get 
        public Representation test() { 
        String test = "test"; 
        String md5 = DigestUtils.toMd5(test); 
    
        StringRepresentation repr = new StringRepresentation(test); 
        repr.setTag(new Tag(md5)); 
        return repr; 
        } 
    } 
    
  • Клиент , который выполняет два вызова: первый без etag и второй с etag, который должен вернуть код состояния 304.

    // First call 
    ClientResource cr 
        = new ClientResource("http://localhost:8182/test"); 
    Representation repr = cr.get(); 
    Tag tag = repr.getTag(); 
    System.out.println(">> cr = "+cr); // Status code: 200 
    
    // Second call 
    cr.getRequest().getConditions().getNoneMatch().add(tag); 
    cr.get(); 
    System.out.println(">> cr = "+cr); // Status code: 304 
    

Я не знаю, что вы используете в ресурсе сервера. Не стесняйтесь говорить мне.

Надеется, что это помогает вам, Тьерри

+0

Тест сохранял тег из первого запроса в виде строки, вызывая clientResource.get(). GetTag(). GetName() и создавая новый объект тега из этой строки во второй раз. Принимая этот дополнительный шаг и просто сохраняя и повторно используя объект тега, он снова снова начал работать. Спасибо за ваш пример, это было полезно и чисто! – Nick

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

  • Нет связанных вопросов^_^