骆驼仅在浏览器而不是邮递员的第二次调用中获得 304 响应



我在使用骆驼休息应用程序时遇到问题。 该路由返回我从 PostMan 调用时期望的结果,但从浏览器它第一次返回结果,而第二次我得到 304 错误代码HttpOperationFailedException.

我尝试删除/更改标头,例如ETagExpiresLast-ModifiedCache-ControlIf-Modified-Since,正如我在类似问题的其他答案中读到的那样,但没有任何改变。

如何避免此错误?有人可以解释我为什么我会打电话吗http://localhost:8080/facebook/name仅从浏览器而不是从邮递员? 如果我尝试直接在浏览器中调用https://graph.facebook.com/v2.11/1234567?fields=name&access_token=ABCD1234MYTOKEN则没有问题。

代码如下:

路由在 TriggerRouteBuilderClass 中定义:

package it.mycompany.facebook.service.camel.route;
import static javax.ws.rs.HttpMethod.GET;
import static org.apache.camel.Exchange.HTTP_METHOD;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.rest.RestBindingMode;
import org.springframework.stereotype.Component;
import it.skytv.facebook.client.types.FacebookApplication;
@Component
public class TriggerRouteBuilder extends RouteBuilder {
@Override
public void configure() {
restConfiguration()
.apiContextPath("/api-docs")
.apiProperty("api.title", "Camel REST API")
.apiProperty("api.version", "1.0")
.apiProperty("cors", "true")
.host("localhost")
.port(8080)
.apiContextRouteId("swagger-api-doc")
.component("servlet")
.bindingMode(RestBindingMode.json);
rest("/facebook")
.get("/name")
.description("Gets the name of the Facebook application")
.route().id("get-app-name-route")
.removeHeaders("CamelHttp*")
.setHeader(HTTP_METHOD, constant(GET))    
.to("{{facebook.api.base.url}}/{{facebook.appID}}?fields=name&access_token={{facebook.permanentToken}})")
.unmarshal("model-jackson-dataformat")
.end()
.endRest();
}
}

配置为:

package it.mycompany.facebook.configuration;
import org.apache.camel.component.jackson.JacksonDataFormat;
import org.apache.camel.component.servlet.CamelHttpTransportServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScans({@ComponentScan("it.mycompany.facebook")})
public class FacebookConfig {
private static Logger trace = LoggerFactory.getLogger(FacebookAsyncServerConfig.class);
@Bean
public ServletRegistrationBean servletRegistrationBean() {
ServletRegistrationBean servlet = new ServletRegistrationBean(
new CamelHttpTransportServlet(), "/*");
servlet.setName("CamelServlet");
return servlet;
}
@Bean(name="model-jackson-dataformat")
public JacksonDataFormat jacksonDataFormat() {
JacksonDataFormat jackson = new JacksonDataFormat();
jackson.setEnableJaxbAnnotationModule(false);
jackson.setPrettyPrint(true);
return jackson;
}
}

主要方法是:

package it.mycompany.facebook;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyFacebookApplication {
public static void main(String[] args) {
SpringApplication.run(MyFacebookApplication .class, args);
}
}

路由中注入的属性在 application.properties 中定义,并且是:

facebook.api.version=v2.11
facebook.api.base.url=https://graph.facebook.com/${facebook.api.version}/
facebook.appID=1234567
facebook.permanentToken=ABCD1234MYTOKEN

更新:从浏览器获取的请求和响应的标头为:

案例确定:

General
Request URL:http://localhost:8080/facebook/name
Request Method:GET
Status Code:200 OK
Remote Address:[::1]:8080
Referrer Policy:no-referrer-when-downgrade  
Response Headers
accept:text/html,application/xhtml+xml,application/
xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding:gzip, deflate, br
accept-language:it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7
Access-Control-Allow-Origin:*
Content-Type:application/json;charset=UTF-8
Date:Wed, 17 Jan 2018 15:49:13 GMT
ETag:"b2790db5428802fhf415v9735876g323403ua592"
Expires:Sat, 01 Jan 2000 00:00:00 GMT
facebook-api-version:v2.11
Server:Apache-Coyote/1.1
Strict-Transport-Security:max-age=15552000; preload
Transfer-Encoding:chunked
upgrade-insecure-requests:1
X-Application-Context:application:8080
Request Headers
Accept:text/html,application/xhtml+xml,
application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

案例304:

General:
Request URL:http://localhost:8080/facebook/name
Request Method:GET
Status Code:500 Internal Server Error
Remote Address:[::1]:8080
Referrer Policy:no-referrer-when-downgrade
Response Headers
Connection:close
Content-Type:text/plain;charset=ISO-8859-1
Date:Wed, 17 Jan 2018 15:54:41 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
X-Application-Context:application:8080
Request Headers
Accept:text/html,application/xhtml+xml,
application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:8080
If-None-Match:"b2790db5428802fhf415v9735876g323403ua592"
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

非常感谢。

我解决了从我得到的响应中删除 ETag 的问题。 多亏了@CBroe的提示,我发现来自浏览器的第二个请求具有标头"If-None-Match",从上一个响应中检查"ETag"的值。

最新更新