2013-03-07 12 views
5

リモートサーバーから応答を取得しようとしています。ここに私のコードです:HttpGetのAndroid java.lang.IllegalArgumentException

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&params= { "はuserId": 1、 "userName": "ЮрийКлинских"}

「{」文字は何ですか?私はすでに、この例外に関するいくつかの記事を読んで、解決策を見つけたが、この解決策は、別の例外が発生します。私はラインurl = URLEncoder.encode(url, "UTF-8");をuncommet場合には、そのような例外を除いてラインresponse = httpClient.execute(httpGet);でcraches:

java.lang.IllegalStateException:ターゲットホストはいけませんnullにするか、パラメータで設定します。スキーム= nullを、ホスト= nullで、パス= http://www.pappico.ru/promo.php?action=RegisterUser&params= { "はuserId":1、 "userNameに": "Юрий+Клинских"}

私はそれを動作させるために何をすべきか分かりません。任意の助けいただければ幸い:)

答えて

7

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

String request = baseRequestUrl + "RegisterUser&params=" +  
     java.net.URLEncoder.encode("{\"userId\":" + userId + ",\"userName\":\"" + userName + "\"}", "UTF-8"); 
+0

はそうとライン応答= httpClient.execute(HTTPGET)で例外android.os.NetworkOnMainThreadExceptionを取得します。 ' – konunger

+3

それは私の間違いだ - 私はUIスレッドからネットワークで作業しているようだ)) – konunger

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; 
    } 

(これはのparams = ...でURLフラグメントをコードします)、 URL全体よりも上記の可能なduplicateもご覧ください。


ボーナス 注JSONは、典型的には、(代わりにGETの)POSTを介して転送されること。 「ライブヘッダー」のようなプログラムを使用して、手動で手順を実行して(たとえば、ユーザーを登録するなど)、舞台裏で何が起こっているのかを確認できます。この場合、エンティティの本文に{..}情報を送ります。 HTTP POST using JSON in Java

また、JSONを書くもう1つの方法(特に複雑な場合)は、モデルクラスとObjectMapper(Jacksonなど)を使用して文字列に変換する方法です。あなたは、文字列に「\のようにフォーマットすることを避けるため、これは便利です

ここではそのいくつかの例です:。JSON to Java Objects, best practice for modeling the json stream

関連する問題