授权标头在Android中与HTTPUrlConnection间歇性失败

问题描述

我在Android中使用HttpUrlConnection实现了应用程序和聊天机器人服务器之间的通信。事实是,在95%的时间内,一切正常。

聊天机器人服务器返回代码200的其他5%的次数,但拒绝与应用程序中的用户聊天。 因此,代码200告诉我通信可以正常进行,直到应用程序可以向聊天机器人服务器发送请求以开始与机器人的对话为止。服务器以状态200和响应进行响应,该响应指示是否允许用户发送带有进一步请求的与机器人的对话。

5%的情况是Authorization标头中的“ Something”(oauth标头,使用者密钥,会话等)错误,并且聊天机器人服务器使用响应代码200和消息通知应用程序说:“错误40发生了,无法与漫游器进行对话”。 (当Authorization标头看起来不像这样时,将返回错误40:

oauth_consumer_key="FjdN7KJPRXEGpAPhabc123b9XobQsLuUHuHL",oauth_nonce="-abc1238625690508",oauth_signature="1abc4fAlCAF033OmpuS6FpWXo%3D",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1364453",oauth_version="1.0"

顺便说一句,正如您从我的HTTPUrlConnection代码下面看到的那样,这些值均未设置,因此我假设在幸运的成功条件下,将设置认值:

@Override
        protected Void doInBackground(String... params) {
            try {
                this.url = new URL(getBackendEndpoint());
                HttpURLConnection urlConnection = null;
                bodyData = this.params.getBytes(StandardCharsets.UTF_8);
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setDoOutput(true);
                urlConnection.setRequestMethod("POST");
                urlConnection.setInstanceFollowRedirects(false);
                urlConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
                urlConnection.setRequestProperty("charset","utf-8");
                urlConnection.setRequestProperty("Connection","Keep-Alive");
                urlConnection.setRequestProperty("Cache-Control","no-cache");
                urlConnection.setRequestProperty("Content-Length",Integer.toString(bodyData.length));
                urlConnection.setRequestProperty("Accept-Encoding","UTF-8");
                urlConnection.setUseCaches(false);
                urlConnection.setConnectTimeout(10000);
                urlConnection.setReadTimeout(10000);

                String baseAuthStr = ANDROID_CONSUMER_KEY + ":" + ANDROID_CONSUMER_SECRET;
                urlConnection.addRequestProperty("Authorization","Basic " + baseAuthStr);

                try (DataOutputStream wr = new DataOutputStream(urlConnection.getoutputStream())) {
                    wr.write(bodyData);
                }

                urlConnection.connect();

                // Responses from the server (code and message)
                InputStream inputStream;
                int status = urlConnection.getResponseCode();

                if (status != HttpURLConnection.HTTP_OK) {
                    success = false;
                    inputStream = urlConnection.getErrorStream();
                } else {
                    success = true;
                    inputStream = urlConnection.getInputStream();
                }

                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String inputLine;
                result="";
                while ((inputLine = reader.readLine()) != null) {
                    result += inputLine;
                }
                reader.close();

                loge("KB URLCONNECTION,getResponseCode: " + String.valueOf(status)); //This is most surely always 200
                loge("KB URLCONNECTION,result: " + result); //Here is where Error 40 is informed by the Backend
                urlConnection.disconnect();
                if (result.isEmpty()) {
                    result = "{}";
                }
            } catch (MalformedURLException | ProtocolException e) {
                handleException(e);
                e.printstacktrace();
            } catch (IOException e) {
                e.printstacktrace();
                handleException(e);
            }

            responseHandler.handleResponse(success,result);
            return null;
        }

那么为什么HTTPURLConnection有时只会失败? 我可以打印/记录成功请求的标题并将它们与错误请求进行比较吗? 在HTTPUrlConnection中设置oauth授权标头的正确方法是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)