神刀安全网

说说在 Android 中如何发送 HTTP 请求

客户端会向服务器发出一条 HTTP 请求,服务器收到请求后会返回一些数据给客户端,然后客户端再对这些数据进行解析与处理。

1 HttpURLConnection

可以使用 HttpURLConnection(官方推荐) 来发送 HTTP 请求。

布局文件:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:id="@+id/activity_main"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="vertical">      <Button         android:id="@+id/send_request"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:text="发送请求"         />      <!--带滚动条的视图-->     <ScrollView         android:layout_width="match_parent"         android:layout_height="match_parent">          <!--响应数据-->         <TextView             android:id="@+id/response_data"             android:layout_width="match_parent"             android:layout_height="wrap_content"              />      </ScrollView>   </LinearLayout>  

活动类:

public class MainActivity extends AppCompatActivity {      private TextView textView;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          findViewById(R.id.send_request).setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 send();             }         });          textView = (TextView) findViewById(R.id.response_data);     }      private void send() {         //开启线程,发送请求         new Thread(new Runnable() {             @Override             public void run() {                 HttpURLConnection connection = null;                 BufferedReader reader = null;                 try {                     URL url = new URL("http://www.163.com");                     connection = (HttpURLConnection) url.openConnection();                     //设置请求方法                     connection.setRequestMethod("GET");                     //设置连接超时时间(毫秒)                     connection.setConnectTimeout(5000);                     //设置读取超时时间(毫秒)                     connection.setReadTimeout(5000);                      //返回输入流                     InputStream in = connection.getInputStream();                      //读取输入流                     reader = new BufferedReader(new InputStreamReader(in));                     StringBuilder result = new StringBuilder();                     String line;                     while ((line = reader.readLine()) != null) {                         result.append(line);                     }                     show(result.toString());                 } catch (MalformedURLException e) {                     e.printStackTrace();                 } catch (ProtocolException e) {                     e.printStackTrace();                 } catch (IOException e) {                     e.printStackTrace();                 } finally {                     if (reader != null) {                         try {                             reader.close();                         } catch (IOException e) {                             e.printStackTrace();                         }                     }                     if (connection != null) {//关闭连接                         connection.disconnect();                     }                 }             }         }).start();     }      /**      * 展示      *      * @param result      */     private void show(final String result) {         runOnUiThread(new Runnable() {             @Override             public void run() {                 textView.setText(result);             }         });     } } 

因为在 Android 中不允许在子线程中执行 UI 操作,所以我们通过 runOnUiThread 方法,切换为主线程,然后再更新 UI 元素。

最后记得声明网络权限哦:

<uses-permission android:name="android.permission.INTERNET" /> 
说说在 Android 中如何发送 HTTP 请求

服务器响应数据

2 OKHttp

OKHttp 是一个处理网络请求的开源项目,目前是 Android 最火热的轻量级框架,由移动支付 Square 公司贡献(该公司还贡献了Picasso)。希望替代 HttpUrlConnection 和 Apache HttpClient。

首先引入 OKHttp 库依赖:

dependencies {     compile fileTree(dir: 'libs', include: ['*.jar'])     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {         exclude group: 'com.android.support', module: 'support-annotations'     })     compile 'com.android.support:appcompat-v7:24.2.1'     testCompile 'junit:junit:4.12' //    网络通信库     compile "com.squareup.okhttp3:okhttp:3.10.0" } 

然后点击 Android Studio 右上角的 Sync Now,把库真正加载进来。

修改活动类:

/**  * 发送请求(使用 OKHttp)  */ private void sendByOKHttp() {     new Thread(new Runnable() {         @Override         public void run() {             OkHttpClient client = new OkHttpClient();             Request request = new Request.Builder().url("http://www.163.com").build();             try {                 Response response = client.newCall(request).execute();//发送请求                 String result = response.body().string();                 Log.d(TAG, "result: "+result);                 show(result);             } catch (IOException e) {                 e.printStackTrace();             }         }     }).start(); } 

可以在 build() 方法之前连缀很多其他方法来丰富这个 Request 对象。

如果是 POST 请求,那么需要构建 RequestBody 对象,形如:

RequestBody requestBody = new FormBody.Builder().add("param1", "value1").add("param2", "value2").build(); Request request = new Request.Builder().url("www.163.com").post(requestBody).build(); 

修改活动类:

/**  * 发送请求(使用 OKHttp)  */ private void sendByOKHttp() {     new Thread(new Runnable() {         @Override         public void run() {             OkHttpClient client = new OkHttpClient();             Request request = new Request.Builder().url("http://www.163.com").build();             try {                 Response response = client.newCall(request).execute();//发送请求                 String result = response.body().string();                 Log.d(TAG, "result: " + result);                 show(result);             } catch (IOException e) {                 e.printStackTrace();             }         }     }).start(); } 

注意: new Thread(...) 之后需要执行 start() 才会启动线程哦。

运行:

说说在 Android 中如何发送 HTTP 请求


可以看出,OKHttp 比 HttpURLConnection 更强大:同一个网址,OKHttp 能够正确地返回响应数据哦O(∩_∩)O哈哈~

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 说说在 Android 中如何发送 HTTP 请求

分享到:更多 ()