2010-12-28 13 views
40

Ich muss eine HTTP-Post-Anfrage an einen Web-Service für die Authentifizierung des Benutzers mit Benutzername und Passwort durchführen. Der Web-Service-Typ gab mir folgende Informationen, um die HTTP-Post-Anfrage zu erstellen.Android, Java: HTTP-POST-Anfrage

POST /login/dologin HTTP/1.1 
Host: webservice.companyname.com 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 48 

id=username&num=password&remember=on&output=xml 

der XML-Antwort, dass i

bekommen wird
<?xml version="1.0" encoding="ISO-8859-1"?> 
<login> 
<message><![CDATA[]]></message> 
<status><![CDATA[true]]></status> 
<Rlo><![CDATA[Username]]></Rlo> 
<Rsc><![CDATA[9L99PK1KGKSkfMbcsxvkF0S0UoldJ0SU]]></Rsc> 
<Rm><![CDATA[b59031b85bb127661105765722cd3531==AO1YjN5QDM5ITM]]></Rm> 
<Rl><![CDATA[[email protected]]]></Rl> 
<uid><![CDATA[3539145]]></uid> 
<Rmu><![CDATA[f8e8917f7964d4cc7c4c4226f060e3ea]]></Rmu> 
</login> 

Das ist, was ich Httppost postRequest = new Httppost (urlString) tue; Wie konstruiere ich den Rest der Parameter?

Antwort

81

Hier ist ein Beispiel, das zuvor unter androidsnippets.com gefunden wurde (die Seite wird zur Zeit nicht mehr gepflegt).

// Create a new HttpClient and Post Header 
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); 

try { 
    // Add your data 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
    nameValuePairs.add(new BasicNameValuePair("id", "12345")); 
    nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!")); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    // Execute HTTP Post Request 
    HttpResponse response = httpclient.execute(httppost); 

} catch (ClientProtocolException e) { 
    // TODO Auto-generated catch block 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
} 

Sie können also Ihre Parameter als BasicNameValuePair hinzufügen.

Eine Alternative ist (Http)URLConnection zu verwenden. Siehe auch Using java.net.URLConnection to fire and handle HTTP requests. Dies ist die bevorzugte Methode in neueren Android-Versionen (Gingerbread +). Siehe auch this blog, this developer doc und Android HttpURLConnection javadoc.

+1

Gibt es eine einfache Möglichkeit, Arrays hinzuzufügen? Müsstest du sie durchlaufen und das Paar BasicNameValuePair ("array []", array [i]) hinzufügen? – gsingh2011

+1

Ist es auch effektiv für JSON-Dateien anstelle von XML? –

+2

Für Android 2.3 und höher empfiehlt Google die Verwendung von HttpURLConnection. http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpClient.html –

0

Versuchen Httpclient für Java:

http://hc.apache.org/httpclient-3.x/

+1

Haben Sie das 'Android'-Tag vermisst? Es verwendet bereits (eine Lite-Version von) HttpClient unter den Abdeckungen! Siehe auch [HttpPost javadoc] (http://developer.android.com/reference/org/apache/http/client/methods/HttpPost.html). – BalusC

2

Bitte beachten Sie Httppost verwenden. Nehmen Sie von diesem: http://www.javaworld.com/javatips/jw-javatip34.html

URLConnection connection = new URL("http://webservice.companyname.com/login/dologin").openConnection(); 
// Http Method becomes POST 
connection.setDoOutput(true); 

// Encode according to application/x-www-form-urlencoded specification 
String content = 
    "id=" + URLEncoder.encode ("username") + 
    "&num=" + URLEncoder.encode ("password") + 
    "&remember=" + URLEncoder.encode ("on") + 
    "&output=" + URLEncoder.encode ("xml"); 
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

// Try this should be the length of you content. 
// it is not neccessary equal to 48. 
// content.getBytes().length is not neccessarily equal to content.length() if the String contains non ASCII characters. 
connection.setRequestProperty("Content-Length", content.getBytes().length); 

// Write body 
OutputStream output = connection.getOutputStream(); 
output.write(content.getBytes()); 
output.close(); 

Sie müssen die Ausnahme selbst zu fangen.

+0

Wie drucke ich die Antwort? – Tamil

5

zu @BalusC Antwort ich möchte hinzufügen, wie die Reaktion in einem String konvertieren:

HttpResponse response = client.execute(request); 
HttpEntity entity = response.getEntity(); 
if (entity != null) { 
    InputStream instream = entity.getContent(); 

    String result = RestClient.convertStreamToString(instream); 
    Log.i("Read from server", result); 
} 

Here is an example of convertStramToString.

0

verwenden ich den folgenden Code HTTP POST von meiner Android-Client-Anwendung auf C# Desktop-App auf meinem Server zu senden:

// Create a new HttpClient and Post Header 
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php"); 

try { 
    // Add your data 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
    nameValuePairs.add(new BasicNameValuePair("id", "12345")); 
    nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!")); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    // Execute HTTP Post Request 
    HttpResponse response = httpclient.execute(httppost); 

} catch (ClientProtocolException e) { 
    // TODO Auto-generated catch block 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
} 

ich beim Lesen der Anfrage von einem C# app auf meinem Server (so etwas wie ein gearbeitet Webserver wenig Anwendung). ich es geschafft Anfrage lesen gebuchten Daten mit dem folgenden Code:

server = new HttpListener(); 
server.Prefixes.Add("http://*:50000/"); 
server.Start(); 

HttpListenerContext context = server.GetContext(); 
HttpListenerContext context = obj as HttpListenerContext; 
HttpListenerRequest request = context.Request; 

StreamReader sr = new StreamReader(request.InputStream); 
string str = sr.ReadToEnd(); 
1

ich eher Sie Volley verwenden würde empfehlen GET zu machen, PUT, POST ... Anfragen.

Fügen Sie zunächst die Abhängigkeit in Ihrer GRADLE-Datei hinzu. Jetzt

compile 'com.he5ed.lib:volley:android-cts-5.1_r4'

, benutzen Sie diese Code-Schnipsel-Anforderungen zu machen.

RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); 

     StringRequest postRequest = new StringRequest(com.android.volley.Request.Method.POST, mURL, 
       new Response.Listener<String>() 
       { 
        @Override 
        public void onResponse(String response) { 
         // response 
         Log.d("Response", response); 
        } 
       }, 
       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         // error 
         Log.d("Error.Response", error.toString()); 
        } 
       } 
     ) { 
      @Override 
      protected Map<String, String> getParams() 
      { 
       Map<String, String> params = new HashMap<String, String>(); 
       //add your parameters here as key-value pairs 
       params.put("username", username); 
       params.put("password", password); 

       return params; 
      } 
     }; 
     queue.add(postRequest);