我正在尝试将"Accept-Language" header附加到我正在制作的get请求中,但是当我使用Charles Proxy检查请求时,标头就不存在了。我像这样添加标题。
private HttpURLConnection getConnection(Uri uri) throws Exception {
URL url = new URL(uri.toString());
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.addRequestProperty(ACCEPT_LANGUAGE_HEADER, LanguageProvider.getLanguage());
return urlConnection;
}
奇怪的是,如果我在添加之后记录requestproperties然后我可以看到它在HttpURLConnection中设置。为什么在发送之前将其删除?
更新
我注意到以下标题会自动添加
主机appname-api-staging.herokuapp.com
User-Agent Dalvik / 1.6.0(Linux; U; Android 4.3.1; Galaxy Nexus Build / JLS36I)
代理连接保持活跃
我修改了我的代码以尝试更改用户代理,就像
一样 URL url = new URL(uri.toString());
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.addRequestProperty("User-Agent", "test");
urlConnection.setRequestProperty(ACCEPT_LANGUAGE_HEADER, LanguageProvider.getLanguage());
请注意,这会将主机标题更改为" test"。添加新请求属性和修改旧属性有什么区别?
答案 0 :(得分:0)
这样的事情对我有用:httppost.setHeader("Accept", "application/json");
因此,如果你想用原始语言阅读堂吉诃德,你应该httppost.setHeader(ACCEPT_LANGUAGE_HEADER, "es_ES")
...:P
BTW,我使用的是HttpClient:
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, HTTP_CON_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, HTTP_CON_TIMEOUT);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpGet httpGet = new HttpGet(baseUrl);
httpGet.setHeader("Accept", "application/json");
HttpResponse response = httpclient.execute(httpGet);
答案 1 :(得分:0)
我知道这是一个老问题,原始海报可能已经开始了,但这个答案适用于其他任何人(像我一样)似乎也有同样的问题。
问题可能根本不在HttpURLConnection
。它可能与标头名称和服务器配置有关。我运行了类似的测试,例如暂停执行和检查以查看我添加的标头是否已在HttpURLConnection
中设置(并且它是),更改自动添加的另一个标头的值(确实有效),以及将标题的名称更改为某些测试名称,例如XYZ,它起作用;我能够在服务器端检索值。还有一个,我使用HTTP工具设置标头并发送请求。这也只有在我改变了标题的名称时才有效。
所以,就我而言,问题出在服务器端。由于某种原因,Apache或PHP正在删除标头。因此,作为一种变通方法/解决方案,我将以下指令添加到apache配置中:
RewriteCond %{HTTP:Header_Name} (.+)
RewriteRule .* - [env=HTTP_HEADER_NAME:%1]