5

リモートサーバーからの応答を取得しようとしています。これが私のコードです:

private static String baseRequestUrl = "http://www.pappico.ru/promo.php?action=";

    @SuppressWarnings("deprecation")
    public String executeRequest(String url) {
        String res = "";
        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse response;      

        try {   
            //url = URLEncoder.encode(url, "UTF-8");
            HttpGet httpGet = new HttpGet(url);

            response = httpClient.execute(httpGet);
            Log.d("MAPOFRUSSIA", response.getStatusLine().toString());

            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream inStream = entity.getContent();
                res = streamToString(inStream);

                inStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return res; 
    }

    public String registerUser(int userId, String userName) {
        String res = "";
        String request = baseRequestUrl + "RegisterUser&params={\"userId\":" +
                 userId + ",\"userName\":\"" + userName + "\"}";

        res = executeRequest(request);

        return res; 
    }

そして、次の例外が行に表示されますHttpGet httpGet = new HttpGet(url):

java.lang.IllegalArgumentException: インデックス 59 のクエリに無効な文字があります: http://www.pappico.ru/promo.php?action=RegisterUser¶ms= {"userId":1,"userName":"Юрий Клинских"}

「{」文字の何が問題になっていますか? 私はすでにこの例外に関するいくつかの投稿を読み、解決策を見つけましたが、この解決策は別の例外を引き起こします:行のコメントを外すと、そのような例外url = URLEncoder.encode(url, "UTF-8");のある行でクラッシュしresponse = httpClient.execute(httpGet);ます:

java.lang.IllegalStateException: ターゲット ホストを null にすることも、パラメーターに設定することもできません。スキーム=ヌル、ホスト=ヌル、パス= http://www.pappico.ru/promo.php?action=RegisterUser¶ms= {"userId":1,"userName":"Юрий+Клинских"}

それを機能させるために何をすべきかわかりません。どんな助けでも大歓迎です:)

4

2 に答える 2

7

URLパラメータをエンコードする必要があります。

String request = baseRequestUrl + "RegisterUser&params=" +    
        java.net.URLEncoder.encode("{\"userId\":" + userId + ",\"userName\":\"" + userName + "\"}", "UTF-8");
于 2013-03-07T01:15:51.273 に答える
0

試す:

public String registerUser(int userId, String userName) {
        String res = "";

        String json = "{\"userId\":" +
                 userId + ",\"userName\":\"" + userName + "\"}";
        String encodedJson = URLEncoder.encode(json, "utf-8");

        String request = baseRequestUrl + "RegisterUser&params=" + encodedJson;

        res = executeRequest(request);
        return res;
    }

(これは、URL 全体ではなく、params=... で URL フラグメントをエンコードします。上記の重複の可能性を確認することもできます。


おまけ: JSON は通常、(GET ではなく) POST 経由で転送されることに注意してください。"Live Headers" のようなプログラムを使用して手動で手順を実行し (ユーザーを登録するなど)、舞台裏で何が起こっているかを確認できます。この場合、エンティティ本体で {..} 情報を送信します。これを行う1つの方法があります-JavaでJSONを使用したHTTP POST

また、JSON を記述する別の方法 (特に複雑になる場合) は、モデル クラスを使用してから、ObjectMapper (Jackson など) を使用して文字列に変換することです。これは、文字列で \" のような書式設定を避けることができるので便利です。

その例を次に示します: JSON から Java オブジェクトへ、json ストリームをモデル化するためのベスト プラクティス

于 2013-03-07T01:18:32.247 に答える