2017-10-27 6 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(); 
    } 
} 
  • HTTPステータスコードに対応intを返しResponseData.getStatusCode():ここ

    コードです。

  • ResponseData.getEntities()は、シリアル化可能オブジェクトのListを返します。
  • ResponseData.getETag()は、getEntitiesによって返されたエンティティオブジェクトに対応するハッシュを含むStringを返します。

ここでは、サーバーへの私の要求です:

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

ここでは、サーバからのレスポンスヘッダーです:

< 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値が値と一致しましたIf-None-Matchリクエストヘッダーにあります。 304 Not Modifiedの返信が届かないのはなぜですか?

答えて

0

問題が見つかりました。この問題は、responseDataオブジェクトにeTag値をロードするコードの別の部分にありました。その結果、responseData.getETag()メソッドは、開始および終了の二重引用符を含む文字列を返していました。私は、私がリモートサーバーから自分のデータと関連付けられたeTagを引っ張っています。具体的

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

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

を変更することにより、仕事に物事を得ることができた、と私はそれらを取得するためにApache HttpClientを使用しています。 次のコードは、ヘッダからのeTagを取得:

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

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

    return null; 
} 

生ETagヘッダがETag: \"etagvalue\"あります。 eTagHeader.getValue()etagvalueを返しますが、代わりに\"etagvalue\"を返します。

関連する問題