【问题标题】:setRequestProperty method giving java.lang.IllegalStateException: Cannot set method after connection is made给出 java.lang.IllegalStateException 的 setRequestProperty 方法:建立连接后无法设置方法
【发布时间】:2023-03-20 17:26:01
【问题描述】:
HttpURLConnection con = null;
        Response response = new Response();
        String TAG = "HttpConHandler";

        try{
            /*
             * IMPORTANT: 
             * User SHOULD provide URL Encoded Parms
             */
            Log.p(TAG, "URL="+ urlStr);
            String q=httpHeaders.get("Authorization");

            URL url = new URL(urlStr);
            con = (HttpURLConnection) url.openConnection(); 

            con.setRequestProperty("Authorization", q);
            con.setRequestProperty("GData-Version", "3.0");

嗨,当setRequestProperty 方法被调用时,我收到java.lang.IllegalStateException: Cannot set method after connection is made 错误,但是当我在连接之前调用此方法时,我得到NullPointerException,因为con 为空。我该怎么做才能解决这个问题?

【问题讨论】:

  • 似乎很清楚。设置属性后打开连接
  • @Ovidiu Latcu 但我得到一个空指针异常,原因是 con 未初始化
  • 您发布的代码与描述的不符。您没有调用 setResponseCode(),这是一个 servlet 方法,而不是 HttpURLConnection 方法,并且您也没有更改连接的方法,正如异常消息所建议的那样。显然,真正的问题是您以其他方式调用setRequestProperty()setRequestMethod()getOutputStream()。请贴出真实代码。

标签: java android httpconnection


【解决方案1】:

不要使用 URL 的便捷方法,要么使用 HttpURLConnection 或其他库。

【讨论】:

  • 抱歉没有让你安静地使用 HttpURLConnection..你的意思是我不应该使用 url.openConnection
  • @Dennis 是的; openConnection 使用自己的连接并打开它,就像方法名称所暗示的那样。
  • @Dennis Maclema 的回答可能会更好;不确定。
【解决方案2】:

这可能有效:

URL url = new URL(urlStr);
con = (HttpURLConnection) url.openConnection(); 
con.setDoOutput(true);
con.setRequestProperty("Authorization", q);
con.setRequestProperty("GData-Version", "3.0");

【讨论】:

【解决方案3】:

请检查来自 Google 的此网址:http://developer.android.com/reference/java/net/HttpURLConnection.html

在设置标题之前可以使用openConnection() 方法。以下是文档中的步骤:

  1. 通过调用 URL.openConnection() 获取新的 HttpURLConnection 并将结果转换为 HttpURLConnection。
  2. 准备请求。请求的主要属性是它的 URI。请求标头还可能包含元数据,例如凭据、首选内容类型和会话 cookie。
  3. 可选择上传请求正文。如果实例包含请求正文,则必须使用 setDoOutput(true) 配置实例。通过写入getOutputStream()返回的流来传输数据。
  4. 阅读响应。响应标头通常包括元数据,例如响应正文的内容类型和长度、修改日期和会话 cookie。可以从getInputStream() 返回的流中读取响应正文。如果响应没有正文,则该方法返回一个空流。
  5. 断开连接。读取响应正文后,应通过调用 disconnect() 关闭 HttpURLConnection。断开连接会释放连接所占用的资源,以便它们可以被关闭或重用。

但是,如果问题仍然存在,您可以尝试调试您的代码并检查 connection.connected 私有标志以查看它在哪里变为真;我在调用getContentType() 方法后遇到了类似的问题。

否则你可以直接切换到 HttpClient API:

  HttpClient httpclient = new DefaultHttpClient();

    // Prepare a request object
    HttpGet httpget = new HttpGet(url); 

    // Execute the request
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多