HttpURLConnection中不遵守AddRequest

时间:2014-10-31 13:24:47

标签: android

我正在尝试将"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"。添加新请求属性和修改旧属性有什么区别?

2 个答案:

答案 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]