2017-10-27 27 views
0

Wildfly에서 REST 서비스를 실행하고 304 Not Modified 응답을 생성하기 위해 Request.evaluatePreconditions 메서드를 사용하려고합니다.javax 요청 개체가 If-None-Match 헤더의 전제 조건을 평가하지 않습니다.

I는 요청의 헤더에 If-None-Match ETAG 값을 전달하고 있지만,이 EntityTag If-None-Match 헤더의 값과 일치하는 경우에도 evaluatePreconditions 방법은 304 응답을 생성하지 않는다.

import java.util.concurrent.ExecutionException; 
import java.util.logging.Level; 
import javax.ejb.Stateless; 
import javax.ejb.TransactionManagement; 
import javax.ejb.TransactionManagementType; 
import javax.inject.Inject; 
import javax.persistence.PersistenceException; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.EntityTag 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Request; 
import javax.ws.rs.core.Response; 

import com.mycompany.DataClient; 
import com.mycompany.ResponseData; 

@Path ("entities") 
@Stateless 
@TransactionManagement (TransactionManagementType.BEAN) 
public class RESTService 
{ 
    @Inject 
    private DataClient m_DataClient; 

    @GET 
    @Produces (MediaType.APPLICATION_JSON) 
    public Response findAllEntities (@Context Request request) 
    { 
     Response.ResponseBuilder response = null; 

     try 
     { 
      ResponseData responseData = m_DataClient.findAll(); 

      EntityTag tag = new EntityTag (responseData.getETag()); 

      response = request.evaluatePreconditions (tag); 

      if (response == null) 
      { 
       response = Response.status (responseData.getStatusCode()).entity (responseData.getEntities()).tag (responseData.getETag()); 
      } 
     } 
     catch (IllegalStateException | PersistenceException | InterruptedException | ExecutionException ex) 
     { 
      m_Logger.log (Level.SEVERE, "Find All Data Exception", ex); 
      response = Response.serverError(); 
     } 

     return response.build(); 
    } 
} 
  • ResponseData.getStatusCode()는 HTTP 상태 코드에 해당하는 int 반환 여기

    는 코드입니다.
  • ResponseData.getEntities()List의 직렬화 가능 객체를 반환합니다.
  • ResponseData.getETag()getEntities이 반환 한 엔터티 개체에 해당하는 해시가 포함 된 String을 반환합니다. 당신이 볼 수 있듯이

    < HTTP/1.1 200 OK 
    < ETag: "7056166173985" 
    < X-Powered-By: caffeine 
    < Access-Control-Allow-Credentials: true 
    < Content-Type: application/json 
    < Content-Length: 1227 
    < Date: Fri, 27 Oct 2017 02:00:39 GMT 
    < Via: 1.1 google 
    < Alt-Svc: clear 
    < 
    

    는 응답 헤더에서의 ETag 값이 값과 일치 : 서버에서 응답 헤더 여기

    curl -H "Accept:application/json" -H "If-None-Match:7056166173985" -H "Authorization:Bearer adsf" -k -v https://mycompany.com/entities 
    

    것 :

다음은 서버 내 요청입니다 If-None-Match 요청 헤더 304 Not Modified 응답을받지 못하는 이유는 무엇입니까?

답변

0

문제점을 발견했습니다. 문제는 내 코드의 다른 부분에 eTag 값을 responseData 개체로로드하는 것이 었습니다. 결과적으로 responseData.getETag() 메서드는 열기 및 닫기 큰 따옴표가 포함 된 문자열을 반환하고있었습니다. 난 원격 서버에서 내 데이터 및 관련 ETAG를 당겨하고 특히

EntityTag tag = new EntityTag (responseData.getETag().replaceAll ("^\"|\"$", "")); 

EntityTag tag = new EntityTag (responseData.getETag()); 

을 변경하여 작업에 물건을 얻을 수 있었고, 내가 그들을 검색 할 Apache HttpClient을 사용하고 있습니다 .

private String retrieveETag (HttpResponse response) 
{ 
    Header eTagHeader = response.getLastHeader ("etag"); 

    if (eTagHeader != null) 
    { 
     return eTagHeader.getValue(); 
    } 

    return null; 
} 

원시 ETAG 헤더 ETag: \"etagvalue\"입니다 : 다음 코드는 헤더에서 ETAG를 검색합니다. eTagHeader.getValue()etagvalue을 반환하지만, 대신 \"etagvalue\"을 반환합니다.