Pytanie Wysyłanie żądania HTTP POST JSON z systemu Android


Korzystam z poniższego kodu, aby wysłać żądanie http POST, które wysyła obiekt do usługi WCF. Działa to dobrze, ale co się stanie, jeśli moja usługa WCF będzie wymagać innych parametrów? Jak mogę je wysłać z mojego klienta Android?

To jest kod, który napisałem do tej pory:

StringBuilder sb = new StringBuilder();  

String http = "http://android.schoolportal.gr/Service.svc/SaveValues";  


HttpURLConnection urlConnection=null;  
try {  
    URL url = new URL(http);  
    urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setDoOutput(true);   
    urlConnection.setRequestMethod("POST");  
    urlConnection.setUseCaches(false);  
    urlConnection.setConnectTimeout(10000);  
    urlConnection.setReadTimeout(10000);  
    urlConnection.setRequestProperty("Content-Type","application/json");   

    urlConnection.setRequestProperty("Host", "android.schoolportal.gr");
    urlConnection.connect();  

    //Create JSONObject here
    JSONObject jsonParam = new JSONObject();
    jsonParam.put("ID", "25");
    jsonParam.put("description", "Real");
    jsonParam.put("enable", "true");
    OutputStreamWriter out = new   OutputStreamWriter(urlConnection.getOutputStream());
    out.write(jsonParam.toString());
    out.close();  

    int HttpResult =urlConnection.getResponseCode();  
    if(HttpResult ==HttpURLConnection.HTTP_OK){  
        BufferedReader br = new BufferedReader(new InputStreamReader(  
            urlConnection.getInputStream(),"utf-8"));  
        String line = null;  
        while ((line = br.readLine()) != null) {  
            sb.append(line + "\n");  
        }  
        br.close();  

        System.out.println(""+sb.toString());  

    }else{  
            System.out.println(urlConnection.getResponseMessage());  
    }  
} catch (MalformedURLException e) {  

         e.printStackTrace();  
}  
catch (IOException e) {  

    e.printStackTrace();  
    } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}finally{  
    if(urlConnection!=null)  
    urlConnection.disconnect();  
}  

43
2017-12-17 10:06


pochodzenie


Śledź ten link. Próbujesz wysyłać inne parametry, cios linku da ci demonstrację, jak możesz je wysłać po kodowaniu xyzws.com/Javafaq/... - Amir Qayyum Khan


Odpowiedzi:


Zamieszczanie parametrów za pomocą testu POST: -

URL url;
URLConnection urlConn;
DataOutputStream printout;
DataInputStream  input;
url = new URL (getCodeBase().toString() + "env.tcgi");
urlConn = url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);
urlConn.setUseCaches (false);
urlConn.setRequestProperty("Content-Type","application/json");   
urlConn.setRequestProperty("Host", "android.schoolportal.gr");
urlConn.connect();  
//Create JSONObject here
JSONObject jsonParam = new JSONObject();
jsonParam.put("ID", "25");
jsonParam.put("description", "Real");
jsonParam.put("enable", "true");

Część, którą przegapiłeś, jest następująca ... to znaczy w następujący sposób.

// Send POST output.
printout = new DataOutputStream(urlConn.getOutputStream ());
printout.writeBytes(URLEncoder.encode(jsonParam.toString(),"UTF-8"));
printout.flush ();
printout.close ();

Resztę rzeczy możesz zrobić.


56
2017-12-21 10:52



Przepraszam, że przyjąłem twoją odpowiedź, ale teraz, gdy próbuję ją zaimplementować, napotkam problemy. Gdzie przekazujesz swoje parametry? - Libathos
Metoda write (int) w typ DataOutputStream nie ma zastosowania dla argumentów (String) - user1940676
Zamiast zapisu (int); Użyłem String str = jsonString.toString (); byte [] data = str.getBytes ("UTF-8"); printout.write (dane); printout.flush (); printout.close (); To działa. - Thirumalvalavan
To stara odpowiedź, ale mi się udało, że odejdę od przestarzałego DefaultHttpClient. Również przeniosłem się z przestarzałego NameValuePair do obiektu JSON. BTW, musiałem zmienić "write" na "writeBytes". - G O'Rilla
Otrzymałem błąd opisany powyżej, błędne typy parametrów dla printout.write (), więc użyłem printout.writeUTF (URLEncoder.encode (params.toString (), "UTF-8")); - jperl


spróbuj czegoś takiego jak cios:

SString otherParametersUrServiceNeed =  "Company=acompany&Lng=test&MainPeriod=test&UserID=123&CourseDate=8:10:10";
String request = "http://android.schoolportal.gr/Service.svc/SaveValues";

URL url = new URL(request); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection();   
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(otherParametersUrServiceNeed.getBytes().length));
connection.setUseCaches (false);

DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(otherParametersUrServiceNeed);

   JSONObject jsonParam = new JSONObject();
jsonParam.put("ID", "25");
jsonParam.put("description", "Real");
jsonParam.put("enable", "true");

wr.writeBytes(jsonParam.toString());

wr.flush();
wr.close();

Referencje:

  1. http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139
  2. Java - wysyłanie parametrów HTTP za pomocą metody POST

13
2017-12-17 10:21



Cóż, zrobiłem to, ale nadal otrzymuję złe żądanie jako odpowiedź serwera. Teraz pozwól mi zapytać, czy zrobiłem wszystko, co jest poprawne: Kiedy ustawiam inny parametr powinien umieścić parametr 1 lub nazwę moich parametrów ?, a mój obiekt Json jest pierwszym Parametr, więc najpierw piszę ten, a potem piszę o innych parametrach, prawda? - Libathos
Po stronie serwera sekwencja param nie ma znaczenia. Wygląda na to, że umieszczasz json w ładunku ... w tym otherParametersUrServiceNeed = "param1=a&param2=b&param3=c"; wpisz nazwę parametrów wymaganych przez serwer, to tylko przykład. Powinieneś najpierw zidentyfikować parametry, których potrzebujesz na żądanie serwera, dodać te parametry i tam wartości String otherParametersUrService jak pokazuje mój przykład. - Amir Qayyum Khan
Jeśli nie jest to poufne, możesz mi powiedzieć, jakie dodatkowe parametry wymaga twój serwer .. tak, że mogę umieścić je w powyższym przykładzie. - Amir Qayyum Khan
Cóż, nie jest, jest w porządku, jeśli podam ci metodę: long InsertStudentAbsences (SRV_Students_Absence objStudentAbsences, string Company, string Lng, string MainPeriod, string ID użytkownika, string CourseDate); - Libathos
potrzebujesz czegoś innego? - Libathos