* Zaktualizowana odpowiedź, która działa na Androidzie 6.0+. Dzięki @Rohit Suthar , @Tamis Bolvari i @sudhiskr za komentarze. *
public class CallAPI extends AsyncTask<String, String, String> {
public CallAPI(){
//set context variables if required
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String urlString = params[0]; // URL to call
String data = params[1]; //data to post
OutputStream out = null;
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
out = new BufferedOutputStream(urlConnection.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
writer.write(data);
writer.flush();
writer.close();
out.close();
urlConnection.connect();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Bibliografia:
Starsza odpowiedź
Uwaga: to rozwiązanie jest nieaktualne. Działa tylko na urządzeniach z Androidem do 5.1. Android 6.0 i nowsze wersje nie zawierają klienta HTTP Apache użytego w tej odpowiedzi.
Klient HTTP z Apache Commons jest najlepszym rozwiązaniem. To jest już zawarte w Androidzie. Oto prosty przykład tego, jak zrobić HTTP Post, używając go.
public void postData() {
// 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", "Hi"));
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
}
}
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
doUTF-8
bicia.HttpClient
”, „HttpPost
”, „HttpResponse
”, „HttpEntity
”, „EntityUtils
”, „NameValuePair
”, „BasicNameValuePair
” są przestarzałe. Proszę zaproponować inne rozwiązanie.DefaultHttpClient
Jest również przestarzałe.NOT
pokazujePOST
przykład. Byłoby miło zredagować6.0
odpowiedź. Jest to wyszukiwarka zoptymalizowana do wyświetlania jako pierwszego wyniku, co jest nieco mylące.dla Androida => 5
W org.apache.http klas i AndroidHttpClient klasa została zaniechana w Androidzie 5.1 . Klasy te nie są już utrzymywane i należy jak najszybciej przeprowadzić migrację dowolnego kodu aplikacji za pomocą tych interfejsów API do klas URLConnection .
https://developer.android.com/about/versions/android-5.1.html#http
Pomysł udostępnienia mojego kodu za pomocą HttpUrlConnection
...
możesz także opublikować metodę:
Aktualizacja 21.02.2016
dla post postu z jsonem zobacz ten przykład:
AKTUALIZACJA 24/08/2016
Użyj najlepszej biblioteki, takiej jak:
ponieważ :
Na niższych poziomach API (głównie na Gingerbread i Froyo) HttpUrlConnection i HttpClient są dalekie od doskonałości
Od czasu wprowadzenia Honeycomb (API 11) wykonywanie operacji sieciowych na osobnym wątku, innym niż główny wątek, było obowiązkowe
źródło
performPostCall()
getPostData()
należy zastąpićgetPostDataString()
W ten sposób możemy wysyłać dane metodą http post i uzyskać wynik
źródło
Oto przykład, w jaki sposób POST wysyłać dane wieloczęściowe BEZ korzystania z zewnętrznych bibliotek Apache:
źródło
na odpowiedź @primpop Dodałbym, jak przekonwertować odpowiedź w ciągu:
Oto przykład convertStramToString .
źródło
HttpClient
”, „HttpPost
”, „HttpResponse
”, „HttpEntity
”, „EntityUtils
”, „NameValuePair
”, „BasicNameValuePair
” są przestarzałe. Proszę zaproponować inne rozwiązanie.Lepiej używaj Apache Commons HttpClient, który jest już dostępny również w Androidzie. Spójrz na Android Developer: Podsumowanie pakietu klienta HTTP Apache, aby uzyskać ogólne informacje na temat interfejsu API.
źródło
Możesz użyć tego do wysłania żądania HTTP POST na adres URL. Możesz łatwo wysłać zapytanie i uzyskać odpowiedź. Zawsze tego używam. Świetnie mi działa.
Musisz także dodać poniższy plik Jar w folderze libs
Na koniec edytuj build.gradle
W ostatnim Przebuduj swój projekt.
źródło
Skorzystaj z
okHttp
biblioteki open source od Square.okHttp
działa od Androida 2.3 i nowszych oraz ma licencję Apache 2.0 na GitHub .Wysyłanie danych POST jest tak proste, jak dodanie następujących elementów w AsyncTask:
okHttp
ma także przestrzeń nazw w maven, więc dodanie jej do projektu Android Studio jest proste. Po prostu dodajcompile 'com.squareup.okhttp3:okhttp:3.11.0'
do build.gradle aplikacji.Kompletny kod
Dodaj następujące elementy do swojej aktywności:
I nazwij to używając:
źródło
Dla mnie działa dalej:
źródło
Możesz używać
URLConnection
z , (do wysyłania danych) i (do odbierania). Słońce ma przykład do dokładnie tego .setDoOutput
(true)
getOutputStream()
getInputStream()
źródło
Jeśli chcesz tylko dołączyć dane do adresu URL, możesz to zrobić za pomocą HttpUrlConnection, ponieważ HttpClient jest już nieaktualny. Lepszym sposobem byłoby użycie biblioteki takiej jak-
Modernizacja Volley
Możemy wysyłać dane do skryptu php, pobierać wyniki i wyświetlać je za pomocą tego kodu wykonanego za pośrednictwem klasy AsyncTask.
Ale korzystanie z bibliotek takich jak volley lub retrofit jest znacznie lepszą opcją, ponieważ klasa Asynctask i HttpurlConnection są wolniejsze w porównaniu do bibliotek. Również biblioteka pobierze wszystko i jest również szybsza.
źródło
Ten pomocny przykład znalazłem w tym samouczku wideo.
źródło
Metoda wysyłania danych jako żądanie HTTP,
źródło
HttpClient
”, „HttpPost
”, „HttpResponse
”, „HttpEntity
”, „EntityUtils
”, „NameValuePair
”, „BasicNameValuePair
” są przestarzałe. Proszę zaproponować inne rozwiązanie.Możesz wysłać test HttpRequest za pomocą klasy WebServer i śledzić odpowiedź w interfejsie odbiornika.
Teraz utwórz DataRack, aby powiązać swoje dane
Teraz wystarczy wysłać żądanie POST z tym stelażem
W tym celu musisz dołączyć moją bibliotekę. Dokumenty tutaj
źródło
W nowszych wersjach Androida musisz umieścić wszystkie sieciowe żądania We / Wy w nowym wątku. AsyncTask działa najlepiej w przypadku małych żądań.
źródło