Restlet获取HTTP状态代码204而不是200

问题描述:

对于第一个请求,我得到了JSON响应.从下一个请求开始,即使ServerResource成功返回了表示形式,我也开始获取此日志和HTTP状态代码204

For the 1st request, I get the JSON response. From the next request onwards I start getting this log and HTTP Status Code 204, even though the ServerResource is successfully returning a representation

org.restlet.engine.adapter.ServerAdapter commit
WARNING: A response with an unavailable and potentially non empty entity was returned. Ignoring the entity for resource http://localhost:8888/xyz?abc=def

布线路线的应用程序类

@Override
public Restlet createInboundRoot() {
    router = new Router(getContext());
    CorsService corsService = new CorsService();         
    corsService.setAllowedOrigins( new HashSet<String>(Arrays.asList("http://example.com")));
    corsService.setAllowedCredentials(true);
    getServices().add(corsService);
    router.attach("/xyz", XYZ.class);
}

处理并返回JSON表示形式的服务器资源

Server Resource which handles and returns a JSON Representation

public class XYZ extends ServerResource {

    private static final Logger logger = Logger.getLogger("API:XyZ");

    @Get(":json")
    public Representation handleGetRequest() {
         ..
         return API_RESPONSE_JSON_REPRESENTATION_SUCCESS;
    }
}

释放响应后,表示状态 available 设置为false.因此,随后对 ServerResource 的调用返回了表示形式,但是在 handle()方法中,由于 getResponseEntity().isAvailable(),它被设置为204.返回 false .

After releasing the response, the representation state available is set to false. So subsequent calls to the ServerResource, returns the Representation but in handle() method it is set to 204 since getResponseEntity().isAvailable() returns false.

来自 ServerResource :

@Override
public Representation handle() {
       ...
        } finally {
            if (Status.CLIENT_ERROR_METHOD_NOT_ALLOWED.equals(getStatus())) {
                updateAllowedMethods();
            } else if (Status.SUCCESS_OK.equals(getStatus())
                    && (getResponseEntity() == null || !getResponseEntity()
                            .isAvailable())) {
                getLogger()
                        .fine("A response with a 200 (Ok) status should have an entity. "
                                + "Changing the status to 204 (No content).");
                setStatus(Status.SUCCESS_NO_CONTENT);
            }
        }
    }
    return result;
}

解决方案

每次返回新的表示形式,或者在返回表示形式之前将setAvailable设置为true

Either return a new representation every time or setAvailable to true before returning the representation