Android-проект с использованием httpclient -> http.client (apache), метод post / get
Я делаю метод Get и Post для проекта android, и мне нужно «перевести» HttpClient 3.x на HttpClient 4.x (используя android). Моя проблема в том, что я не уверен, что я сделал, и я не нахожу «перевод» некоторых методов …
Это HttpClient 3.x я сделал и (->) HttpClient 4.x «перевод», если я его нашел (только стороны, которые задают мне проблемы):
HttpState state = new HttpState (); --> ? HttpMethod method = null; --> HttpUriRequest httpUri = null; method.abort(); --> httpUri.abort(); //httpUri is a HttpUriRequest method.releaseConnection(); --> conn.disconnect(); //conn is a HttpURLConnection state.clearCookies(); --> cookieStore.clear(); //cookieStore is a BasicCookieStore HttpClient client = new HttpClient(); --> DefaultHttpClient client = new DefaultHttpClient(); client.getHttpConnectionManager().getParams().setConnectionTimeout(SOCKET_TIMEOUT) --> HttpConnectionParams.setConnectionTimeout(param, SOCKET_TIMEOUT); client.setState(state); --> ? client.getParams().setCookiePolicy(CookiePolicy.RFC_2109); --> HttpClientParams.setCookiePolicy(param, CookiePolicy.RFC_2109); PostMethod post = (PostMethod) method; --> ? post.setRequestHeader(...,...); --> conn.setRequestProperty(...,...); post.setFollowRedirects(false); --> conn.setFollowRedirects(false); RequestEntity tmp = null; --> ? tmp = new StringRequestEntity(...,...,...); --> ? int statusCode = client.executeMethod(post); --> ? String ret = method.getResponsBodyAsString(); --> ? Header locationHeader = method.getResponseHeader(...); --> ? ret = getPage(...,...); --> ?
Я не знаю, правильно ли это. Это вызвало проблемы, потому что пакеты не называются аналогично, а также некоторые методы. Мне просто нужна документация (я не нашел) и небольшую помощь.
- Бесконечный список прокрутки не работает
- Как разобрать stream ввода JSON
- Нечетная ситуация для «не может ссылаться на это до того, как конструктор супертипа был вызван»
- Использовать интерфейс или тип для определения переменной в java?
- Основной метод не найден, даже если я его объявил
Спасибо заранее за вашу помощь. Майкл
- Загрузить профиль Chrome с помощью Selenium WebDriver с помощью java
- Java: сумма двух целых чисел печатается как конкатенация двух
- Как создать файл .jar или экспортировать jar на IntelliJ (например, экспорт java-архива eclipse)
- Как завершить сканирование при завершении ввода?
- Android - доступ к файлу из активов \ PDF-дисплей
- Подстрочный индекс и надстрочный указатель строки в Android
- Android: как использовать AlarmManager
- Android: добавление текстового представления в линейный макет программно
Вот документы HttpClient 4 , которые использует Android (4, а не 3, начиная с 1.0-> 2.x). Документы трудно найти (спасибо Apache;)), потому что HttpClient теперь является частью HttpComponents (и если вы просто ищете HttpClient, вы, как правило, попадете в материал 3.x).
Кроме того, если вы выполняете любое количество запросов, вы не хотите создавать клиент снова и снова. Скорее, как учебники для HttpClient , создайте клиента один раз и сохраните его. Оттуда используйте ThreadSafeConnectionManager .
Я использую class-помощник, например, что-то вроде HttpHelper (которое все еще является движущейся целью), я планирую в какой-то момент перенести это на свой собственный проект Android util, и поддерживать двоичные данные еще не получили), чтобы помочь с это. Хелпер-class создает клиента и имеет методы удобства обхода для get / post / etc. В любом случае, когда вы используете этот class из Activity , вы должны создать внутреннюю внутреннюю AsyncTask (чтобы вы не блокировали stream пользовательского интерфейса при выполнении запроса), например:
private class GetBookDataTask extends AsyncTask { private ProgressDialog dialog = new ProgressDialog(BookScanResult.this); private String response; private HttpHelper httpHelper = new HttpHelper(); // can use UI thread here protected void onPreExecute() { dialog.setMessage("Retrieving HTTP data.."); dialog.show(); } // automatically done on worker thread (separate from UI thread) protected Void doInBackground(String... urls) { response = httpHelper.performGet(urls[0]); // use the response here if need be, parse XML or JSON, etc return null; } // can use UI thread here protected void onPostExecute(Void unused) { dialog.dismiss(); if (response != null) { // use the response back on the UI thread here outputTextView.setText(response); } } }
Самый простой способ ответить на мой вопрос – показать вам class, который я сделал:
public class HTTPHelp { DefaultHttpClient httpClient = new DefaultHttpClient (); HttpContext localContext = new BasicHttpContext (); private boolean abort; private String ret; HttpResponse response = null; HttpPost httpPost = null; public HTTPHelp () { } public void clearCookies () { httpClient.getCookieStore () ясно (). } public void abort () { пытаться { если (HTTPClient! = NULL) { System.out.println ( "Прервать".); httpPost.abort (); abort = true; } } catch (Исключение e) { System.out.println ("HTTPHelp: Исключение прерывания:" + e); } } public String postPage (String url, String data, boolean returnAddr) { ret = null; httpClient.getParams (). setParameter (ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); httpPost = новый HttpPost (url); response = null; StringEntity tmp = null; httpPost.setHeader («User-Agent», «Mozilla / 5.0 (X11; U; Linux» + «i686; en-US; rv: 1.8.1.6) Gecko / 20061201 Firefox / 2.0.0.6 (Ubuntu-feisty)»); httpPost.setHeader («Accept», «text / html, application / xml», + "Приложение / XHTML + XML, текст / HTML; д = 0,9, текст / обычный; д = 0,8, изображение / PNG, * / *; д = 0,5"); httpPost.setHeader («Content-Type», «application / x-www-form-urlencoded»); пытаться { tmp = new StringEntity (данные, «UTF-8»); } catch (UnsupportedEncodingException e) { System.out.println ("HTTPHelp: UnsupportedEncodingException:" + e); } httpPost.setEntity (TMP); пытаться { response = httpClient.execute (httpPost, localContext); } catch (ClientProtocolException e) { System.out.println ("HTTPHelp: ClientProtocolException:" + e); } catch (IOException e) { System.out.println ("HTTPHelp: IOException:" + e); } ret = response.getStatusLine (). toString (); return ret; } }
Я использовал этот учебник, чтобы выполнить свой метод публикации и примеры thoses (спасибо Daniel).
Спасибо за вашу помощь.
Здесь вы можете найти документацию по этой версии HTTPClient
; особенно полезно пройти примерные сценарии, которые они представляют.
Я, к сожалению, не знаю версии 3 HTTPClient
поэтому я не могу дать прямую эквивалентность; Я предлагаю вам взять то, что вы пытаетесь сделать, и просмотреть их примерные сценарии.
package com.service.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class WebServiceDemoActivity extends Activity { /** Called when the activity is first created. */ private static String SOAP_ACTION1 = "http://tempuri.org/GetSubscriptionReportNames";//"http://tempuri.org/FahrenheitToCelsius"; private static String NAMESPACE = "http://tempuri.org/"; private static String METHOD_NAME1 = "GetSubscriptionReportNames";//"FahrenheitToCelsius"; private static String URL = "http://icontrolusa.com:8040/iPhoneService.asmx?WSDL"; Button btnFar,btnCel,btnClear; EditText txtFar,txtCel; ArrayList headlist = new ArrayList (); ArrayList reportlist = new ArrayList (); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnFar = (Button)findViewById(R.id.btnFar); btnCel = (Button)findViewById(R.id.btnCel); btnClear = (Button)findViewById(R.id.btnClear); txtFar = (EditText)findViewById(R.id.txtFar); txtCel = (EditText)findViewById(R.id.txtCel); btnFar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Initialize soap request + add parameters SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1); //Use this to add parameters request.addProperty("Fahrenheit",txtFar.getText().toString()); //Declare the version of the SOAP request SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); envelope.dotNet = true; try { HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); //this is the actual part that will call the webservice androidHttpTransport.call(SOAP_ACTION1, envelope); // Get the SoapResult from the envelope body. SoapObject result = (SoapObject)envelope.bodyIn; if(result != null) { //Get the first property and change the label text txtCel.setText(result.getProperty(0).toString()); Log.e("err ","output is :::: "+result.getProperty(0).toString()); parseSON(); } else { Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show(); } } catch (Exception e) { e.printStackTrace(); } } }); btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { txtCel.setText(""); txtFar.setText(""); } }); } private void parseSON() { headlist.clear(); reportlist.clear(); String text = txtCel.getText().toString() ;//sb.toString(); Log.i("######", "###### "+text); try{ JSONObject jobj = new JSONObject(text); JSONArray jarr = jobj.getJSONArray("Head"); for(int i=0;i