3

カスタム認証ヘッダーを使用して http リクエストに署名します。

String key="client="+USER+",hash="+sha1(STR, API_KEY)+",timestamp="+t.toString();

sha1 メソッドに興味がある場合: http://pastebin.com/HRFXQ4Bkキー文字列がヘッダーとして使用されます。

URL url = new URL(sb.toString());

HttpURLConnection conn = null;  
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", key);
conn.setRequestMethod("GET");

InputStreamReader in = new InputStreamReader(conn.getInputStream());

応答を取得しようとすると、次のエラーが表示されます。

10-28 18:25:40.111: E/エラー(6855): java.io.EOFException 10-28 18:25:40.111: E/エラー(6855): libcore.io.Streams.readAsciiLine(Streams.java: 203) 10-28 18:25:40.111: E/エラー (6855): libcore.net.http.HttpEngine.readResponseHeaders (HttpEngine.java:579) で 10-28 18:25:40.111: E/エラー (6855) : libcore.net.http.HttpEngine.readResponse(HttpEngine.java:827) 10-28 18:25:40.111: E/error(6855): libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283) ) 10-28 18:25:40.111: E/エラー (6855): libcore.net.http.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:177) で

私のサーバーでは、このリクエストによってアクセスがログに記録されませんでした。ただし、認証ヘッダーを削除すると、サーバーログに従ってサーバーへの接続が確立されます。

では、認証ヘッダーはリクエストにどのように影響するのでしょうか? ヘッダーを使用しているときに接続がないのはなぜですか?


ところで、次のようなヘッダー

conn.setRequestProperty("Authorization", "FOOBAR");

動作しますが、承認ヘッダーが要件に一致しないため拒否されます。

10-29 08:12:07.235: E/error(23663): java.net.ConnectException: api.myserver.net (ポート 1337) への接続に失敗しました: 接続に失敗しました: ECONNREFUSED (接続が拒否されました) 10-29 08:12 :07.235: E/error(23663): libcore.io.IoBridge.connect(IoBridge.java:114) 10-29 08:12:07.235: E/error(23663): java.net.PlainSocketImpl.connect( PlainSocketImpl.java:192) 10-29 08:12:07.235: E/エラー (23663): java.net.PlainSocketImpl.connect (PlainSocketImpl.java:459) で

私の Web サービスでは、ヘッダーに次の形式が必要です

match(/client=([^,]*),hash=([^,]*),timestamp=([^,]*)/);

したがって、この例外は最初の例外とは異なります。ヘッダーを削除して Web サービスの認証を無効にすると、接続は期待どおりに機能します。したがって、問題はカスタム認証ヘッダーにあるようです。何か案は?

4

4 に答える 4

8

この質問によると、特定のバージョンの Android で問題が発生する可能性があるようです。

conn.setRequestProperty("Connection", "close")リクエストに追加してみてください。

于 2013-10-28T19:05:53.033 に答える
1

最初に、URL に予期しない改行 ('\n' または '\r\n') が含まれているかどうかを確認します。含まれている場合は、応答を読み取るときに EOFException が発生します。改行は HTTP パッケージをトランキングし、サーバーはクライアントが送信するデータがまだあると判断するため、応答がありません。応答を読み取ろうとするたびに、すぐに EOF が取得されます。

リクエストが有効であることを確認したら、他の人が提供するソリューションを試してください。

于 2015-01-30T09:19:38.623 に答える
0

その場合、サーバーの応答が正しくないことが原因である可能性があります。

私のサーバーはpython SimpleHTTPServerを使用していましたが、成功を示すために必要なのは次のことだけだと誤って想定していました。

self.send_response(200)

これにより、最初の応答ヘッダー行、サーバー、および日付ヘッダーが送信されますが、ストリームは追加のヘッダーも送信できる状態のままになります。HTTP では、ヘッダーが終了したことを示すために、ヘッダーの後に追加の改行が必要です。HttpURLConnection を使用して結果本体の InputStream や応答コードなどを取得しようとしたときに、この新しい行が存在しない場合は、EOFException がスローされます (これは実際には合理的であり、考えてみると)。一部の HTTP クライアントは、短い応答を受け入れ、成功の結果コードを報告したため、不当に HttpURLConnection を非難することになりました。

代わりにこれを行うようにサーバーを変更しました:

self.send_response(200)
self.send_header("Content-Length", "0")
self.end_headers()

そのコードで EOFException はもうありません。「接続: 閉じる」ソリューションは、これを回避する可能性のある特定のサーバーで何らかの動作をトリガーする可能性があります (たとえば、閉じる前に応答が有効であることを確認する) が、python SimpleHTTPServer の場合はそうではなく、根本的な原因は私のせいです。

注意: Froyo (2.2) より前の Android には、キープアライブ接続に関連するバグがいくつかありますが、これはその 1 つではないと思います。

于 2015-01-08T16:21:32.480 に答える