我以前使用HttpClient和BasicNameValuePairs,由于某种原因我必须转移到HttpUrlConnection.
因此这个代码,使一个HttpPost请求具有一些参数:
- public class MConnections {
- static String BaseURL = "http://www.xxxxxxxxx.com";
- static String charset = "UTF-8";
- private static String result;
- private static StringBuilder sb;
- private static List<String> cookies = new ArrayList<String>();
- public static String PostData(String url,String sa[][]) {
- HttpURLConnection connection = null;
- try {
- connection = (HttpURLConnection) new URL(BaseURL + url)
- .openConnection();
- } catch (MalformedURLException e1) {
- } catch (IOException e1) {
- }
- cookies = connection.getHeaderFields().get("Set-Cookie");
- try{
- connection.setDoOutput(true); // Triggers POST.
- connection.setRequestProperty("Accept-Charset",charset);
- connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=" + charset);
- }catch (Exception e) {
- //Here i get Exception that "java.lang.IllegalStateException: Already connected"
- }
- OutputStream output = null;
- String query = "";
- int n = sa.length;
- for (int i = 0; i < n; i++) {
- try {
- query = query + sa[i][0] + "="
- + URLEncoder.encode(sa[i][1],"UTF-8");
- } catch (UnsupportedEncodingException e) {
- }
- }
- try {
- output = connection.getOutputStream();
- output.write(query.getBytes(charset));
- } catch (Exception e) {
- //Here i get Exception that "android: java.net.protocolException: Does not support output"
- } finally {
- if (output != null)
- try {
- output.close();
- } catch (IOException e) {
- }
- }
- InputStream response = null;
- try {
- response = connection.getInputStream();
- } catch (IOException e) {
- //Here i get Exception that "java.io.IOException: BufferedInputStream is closed"
- } finally {
- //But i am closing it here
- connection.disconnect();
- }
- try {
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- response,"iso-8859-1"),8);
- sb = new StringBuilder();
- sb.append(reader.readLine());
- String line = "0";
- while ((line = reader.readLine()) != null) {
- sb.append("\n" + line);
- }
- response.close();
- result = sb.toString();
- } catch (Exception e) {
- }
- return result;
- }
- }
但是我在代码中注释了这样的异常.
其实我正在使用AsyncTask从我的Activity中调用MConnections.PostData()两次.这可能会导致异常:已连接,但我正在使用connection.disconnect.但为什么我还会得到这个异常?
我用错了吗?
谢谢
解决方法
对于协议异常,请在调用getOutputStream()之前尝试添加以下内容:
- connection.setDoOutput(true);
发现这个答案感谢Brian Roach在这里的答复:https://stackoverflow.com/a/14026377/387781
旁注:我在运行Gingerbread的HTC Thunderbolt上出现了这个问题,但不是在运行Jelly Bean的Nexus 4上.