android的网络编程以http为主,传输以json为主,服务端以java服务端为主。另外,有使用https或者自定义协议的,传输的也有使用xml的,但是比较少,服务端有使用C#,php等。
android的框架有很多,可以使用AsyncHttp(https://github.com/loopj/android-async-http/)。如果使用这个框架,那么需要用到HttpCore的包。
需要注意,HttpClient是一个非常有用的项目,里面包含了,常用的common-logging,http-core,http-mime等,但是这个是java项目,我们需要使用android版本的,这点需要注意。
如果我们自己使用android自身的类进行编程,那么需要注意,Eclipse中使用的如HttpClient这些类,在android studio中并没有,需要在build.gradle的
android {}中添加
useLibrary 'org.apache.http.legacy'
这个包,其实就在sdk\platforms\android-23\optional\org.apache.http.legacy.jar下。添加了这个包之后,就可以使用httpclient的大多数类了。
需要注意,http协议有一个header头,这个头里面存储这传输什么的信息,而http除了url之外,本身是可以传输信息的,使用entity传输。下面是常规的代码:
package com.seatel.mobilehall.net; import android.util.Log; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicHeader; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; /** * Created by han on 2016/1/27. */ public class HttpTool { public String post(String url,JSONObject json) { String result = null; HttpClient client = new DefaultHttpClient(); try { HttpPost post = new HttpPost(new URI(url)); post.setHeader("Content-Type", "application/json"); StringEntity entity = new StringEntity(json.toString(),"utf-8"); entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); post.setEntity(entity); HttpResponse httpResponse = client.execute(post); InputStream inStream = httpResponse.getEntity().getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(inStream,"utf-8")); StringBuilder strber = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { strber.append(line); result = strber.toString(); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } }
package com.seatel.mobilehall.net; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import com.seatel.mobilehall.app.MainActivity; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * Created by han on 2016/1/27. */ public class HttpTask extends AsyncTask<Void, Void, Boolean> { private String result; private Context context; public HttpTask(Context context) { this.context = context; } @Override protected Boolean doInBackground(Void... params) { try { JSONObject json = new JSONObject(); json.put("cmd", "advert"); result = new HttpTool().post("http://120.24.49.116:8080/rqInvokeController", json); } catch (JSONException e) { e.printStackTrace(); } return null; } @Override protected void onPreExecute() { } @Override protected void onPostExecute(Boolean aBoolean) { try { JSONObject response = new JSONObject(result); String code = response.optString("code"); if(code.equals("0")){ JSONArray array = response.optJSONArray("list"); JSONObject obj1 = array.getJSONObject(0); JSONObject obj2 = array.getJSONObject(1); String image1 = obj1.optString("image"); String image2 = obj2.optString("image"); MainActivity activity = (MainActivity) context; activity.imageDisplay(image1); } } catch (JSONException e) { e.printStackTrace(); } } }
以上是常规的http传输json的网络操作。传输的格式如下:
http://120.24.49.116:8080/rqInvokeController {"cmd":"advert"}
分别为url和entity。
如果我们需要传输其他类型的格式,这个时候就用到了httpmime,这点从
HttpPost post = new HttpPost(new URI(url)); post.setHeader("Content-Type", "application/json");声明中知道,上面传输的事json。因此若需要其他格式就需要mime协议,从这个协议的名字可以看出,他其实是在header中声明添加的格式,并且在entity中添加需要的数据entity。对于mime协议中的multiple,在httpmime中,体现为MultipartEntity类,HttpClient.addEntity()方法添加MultipartEntity。
httpmime的详细操作
(未完成)
而如果是https协议的传输,那么跟以上的操作有所不同,
(未完成)