2013-03-07 8 views
5

मैं दूरस्थ सर्वर से प्रतिक्रिया प्राप्त करने का प्रयास कर रहा हूं। यहाँ मेरी कोड है:एंड्रॉइड java.lang.IllegalArgumentException HttpGet

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) में निम्न अपवाद हो रही है: http://www.pappico.ru/promo.php?action=RegisterUser&params= { "उपयोगकर्ता id": सूचकांक 59 पर क्वेरी में अवैध अक्षर:

java.lang.IllegalArgumentException: 1, "उपयोगकर्ता नाम": "Юрий Клинских"}

'{' चरित्र के साथ क्या गलत है? मैं पहले से ही इस अपवाद के बारे में कुछ पोस्ट पढ़ सकते हैं और एक समाधान मिला, लेकिन इस समाधान एक और अपवाद का कारण बनता है: अगर मैं लाइन url = URLEncoder.encode(url, "UTF-8"); uncommet यह इस तरह अपवाद के साथ लाइन response = httpClient.execute(httpGet); पर craches:

java.lang.IllegalStateException: लक्ष्य मेजबान नहीं करना चाहिए शून्य हो, या पैरामीटर में सेट करें। योजना = अशक्त, मेजबान = अशक्त, पथ = http://www.pappico.ru/promo.php?action=RegisterUser&params= { "उपयोगकर्ता id": 1, "उपयोगकर्ता नाम": "Юрий + Клинских"}

क्या मैं इसे काम करने के लिए क्या करना चाहिए पता नहीं है। किसी भी मदद की सराहना की जाएगी :)

उत्तर

7

आप URL पैरामीटर सांकेतिक शब्दों में बदलना करने के लिए है:

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

तो करो और लाइन प्रतिक्रिया में अपवाद android.os.NetworkOnMainThreadException मिल = httpClient.execute (httpGet); ' – konunger

+3

ऐसा लगता है कि यह मेरी गलती है - मैं यूआई थ्रेड से नेटवर्क के साथ काम कर रहा हूं)) – 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; 
    } 

(इस में पैरामीटर = ... URL खंड encodes), बल्कि पूरे यूआरएल की तुलना में। आप उपरोक्त वर्णित संभावित duplicate पर भी एक नज़र डाल सकते हैं।


बोनस: ध्यान दें कि JSON आम तौर पर (किसी GET के बजाय) POST द्वारा स्थानांतरित कर रहा है। आप "लाइव हेडर" जैसे प्रोग्राम का उपयोग कर सकते हैं और दृश्यों के पीछे क्या चल रहा है यह देखने के लिए मैन्युअल रूप से चरणों को करें (उदा। उपयोगकर्ता को पंजीकृत करें)। इस मामले में, आप इकाई निकाय में {..} जानकारी भेज रहे होंगे। HTTP POST using JSON in Java

इसके अलावा, JSON लेखन (विशेष रूप से जब यह और अधिक जटिल हो जाता है) के लिए एक और दृष्टिकोण एक मॉडल वर्ग का उपयोग करने के लिए और फिर एक ObjectMapper (जैसे जैक्सन के रूप में) एक स्ट्रिंग के लिए यह कन्वर्ट करने के लिए है - यहाँ एक ही रास्ता है कि ऐसा करने के लिए है। क्योंकि आप अपने तार में \ की तरह "स्वरूपण होने से बचने यह आसान है

यहाँ है कि के कुछ उदाहरण:। JSON to Java Objects, best practice for modeling the json stream

संबंधित मुद्दे