Android 项目使用 httpclient --> http.client (apache), post/get 方法
Posted
技术标签:
【中文标题】Android 项目使用 httpclient --> http.client (apache), post/get 方法【英文标题】:Android project using httpclient --> http.client (apache), post/get method 【发布时间】:2009-05-17 09:22:17 【问题描述】:我正在为一个 android 项目执行 Get 和 Post 方法,我需要将 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(...,...); --> ?
我不知道这是否正确。 这引起了问题,因为包的名称不同,一些方法也不同。 我只需要文档(我还没有找到)和很少的帮助。
【问题讨论】:
【参考方案1】:这里是HttpClient 4 docs,这是 Android 正在使用的(4,而不是 3,截至 1.0->2.x)。文档很难找到(感谢 Apache ;)),因为 HttpClient 现在是 HttpComponents 的一部分(如果你只是寻找 HttpClient,你通常会在 3.x 的东西上结束)。
此外,如果您执行任意数量的请求,您不希望一遍又一遍地创建客户端。相反,作为tutorials for HttpClient note,创建一次客户端并保留它。从那里使用ThreadSafeConnectionManager。
我使用了一个辅助类,例如 HttpHelper 之类的东西(它仍然是一个移动的目标 - 我计划在某个时候将它移动到它自己的 Android util 项目中,并支持二进制数据,还没有到达那里),以帮助解决此问题。助手类创建客户端,并为 get/post/etc 提供方便的包装方法。在任何从Activity 使用此类的地方,您都应该创建一个内部内部AsyncTask(这样您在发出请求时就不会阻塞 UI 线程),例如:
private class GetBookDataTask extends AsyncTask<String, Void, Void>
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);
【讨论】:
甚至比我的 HttpHelper 更好的是 ZXing 项目使用的那个 - code.google.com/p/zxing/source/browse/trunk/android/src/com/…。使用起来有点困难(尽管仍然很容易),而且能力更强。 (而且我在使用我写了很长时间的那个之后注意到它,类似的方法,虽然不完全相同,但收敛,而不是复制。;)。) HTTP 客户端文档已移动 — 现在位于:hc.apache.org/httpcomponents-client-ga/index.html 请记住,我的答案在这里是一个相当老的答案,而且我有一段时间没有更新那个帮助项目(我打算这样做,只是还没得到它)。从 API 级别 8 开始,Android 有自己的助手:developer.android.com/reference/android/net/http/… 另请注意,Android 团队的建议已更改。他们现在推荐标准的 java.net 东西而不是 HttpClient。有关 HttpURLConnection 的良好包装库,请参见:github.com/kevinsawicki/http-request【参考方案2】:回答我的问题的最简单方法是向您展示我制作的课程:
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().clear();
public void abort()
try
if(httpClient!=null)
System.out.println("Abort.");
httpPost.abort();
abort = true;
catch (Exception e)
System.out.println("HTTPHelp : Abort Exception : "+e);
public String postPage(String url, String data, boolean returnAddr)
ret = null;
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
httpPost = new 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," +
"application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
try
tmp = new StringEntity(data,"UTF-8");
catch (UnsupportedEncodingException e)
System.out.println("HTTPHelp : UnsupportedEncodingException : "+e);
httpPost.setEntity(tmp);
try
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;
我用this tutorial做我的post方法和thoses examples
【讨论】:
第二个链接移到hc.apache.org/httpcomponents-client-ga/examples.html 第一个链接移到hc.apache.org/httpcomponents-client-ga/tutorial/html【参考方案3】:嗯,你可以找到关于 HTTPClient
here 的那个版本的文档;浏览他们提供的example scenarios 特别有用。
不幸的是,我不知道 HTTPClient
的第 3 版,所以我不能给出直接的等价物;我建议您采取您正在尝试做的事情并查看他们的示例场景。
【讨论】:
谢谢,我会看一下文档,希望能找到我的问题的解决方案。【参考方案4】: 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<String> headlist = new ArrayList<String>();
ArrayList<String> reportlist = new ArrayList<String>();
@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<jarr.length();i++)
JSONObject e = jarr.getJSONObject(i);
JSONArray names = e.names();
for(int j=0;j<names.length();j++)
String tagname = names.getString(j);
if (tagname.equals("ReportID"))
headlist.add(e.getString("ReportID"));
if (tagname.equals("ReportName"))
reportlist.add(e.getString("ReportName"));
catch(JSONException e)
Log.e("retail_home", "Error parsing data "+e.toString());
Log.d("length ", "head lenght "+headlist.size());
Log.d("value is ", "frst "+headlist.get(0));
Log.d("length ", "name lenght "+reportlist.size());
Log.d("value is ", "secnd "+reportlist.get(0));
【讨论】:
...但感谢您花时间发布您的代码!以上是关于Android 项目使用 httpclient --> http.client (apache), post/get 方法的主要内容,如果未能解决你的问题,请参考以下文章
Android API 23 - HttpClient 4.X 重新打包
Android studio 中想用 HttpClient 下载网络图片,却没有 HttpClient 以及相关的类
Android compileSdkVersion 23 导致apache网络库HttpClient过期问题
android6.0SDK中删除HttpClient的相关类的解决方法