Android源码分析-OkHttp-2-应用示例

227 阅读1分钟

GET示例

建立服务端
  1. python文件服务器,在桌面创建一文本1.txt,然后执行python命令
pyhton -m http.server 3344
.
Serving HTTP on 0.0.0.0 port 3344 (http://0.0.0.0:3344/) ...
  1. dart服务器代码:
Future main(List<String> args) async {
  var server = await HttpServer.bind(InternetAddress.anyIPv4, 4040);
  print('Listening on http://${server.address.address}:${server.port}');

  await for (var request in server) {
    handleRequest(request);
  }
}

void handleRequest(HttpRequest request) async {
  print('Received request ${request.method}: ${request.uri.path}');
  if (request.method == 'GET') {
    handleGet(request);
  } else {
    await handlePost(request);
  }
  await request.response.close();
}

void handlePost(HttpRequest req) async {
  final content = await utf8.decoder.bind(req).join();
  print('content: ${content}');

  switch (req.uri.path) {
    case '/postjson':
      var data = jsonDecode(content) as Map;
      req.response
        ..statusCode = HttpStatus.ok
        ..write('Wrote data for json.');
      break;

    case '/postform':
      req.response
        ..statusCode = HttpStatus.ok
        ..write('Wrote data for form.');
      break;
    default:
  }
}

void handleGet(HttpRequest req) {
  req.response
    ..statusCode = HttpStatus.ok
    ..write('Wrote data for: GET - ${req.uri.path}');
}
创建请求客户端
private val client = OkHttpClient()
创建Requset
var request = Request.Builder().url("http://10.1.14.192:3344/1.txt").build()
同步GET
client.newCall(request).execute().use { response -> traceResponse(response) }
异步GET
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        e.printStackTrace()
    }

    override fun onResponse(call: Call, response: Response) {
        traceResponse(response)
    }
})
调用代码
Thread(Runnable {
    run {
        println("********start syncget*********")
        syncGet()
        println("********end syncget*********")

        println("********start asyncget*********")
        asyncGet()
        println("********end asyncget*********")
    }
}).start()

//响应结果
I/System.out: ********start syncget*********
I/System.out: Server: SimpleHTTP/0.6 Python/3.7.4
I/System.out: Date: Wed, 25 Dec 2019 07:37:44 GMT
I/System.out: Content-type: text/plain
I/System.out: Content-Length: 9
I/System.out: Last-Modified: Wed, 25 Dec 2019 07:37:34 GMT
I/System.out: {
I/System.out: 	body
I/System.out: }
I/System.out: ********end syncget*********
I/System.out: ********start asyncget*********
I/System.out: ********end asyncget*********
I/System.out: Server: SimpleHTTP/0.6 Python/3.7.4
I/System.out: Date: Wed, 25 Dec 2019 07:37:44 GMT
I/System.out: Content-type: text/plain
I/System.out: Content-Length: 9
I/System.out: Last-Modified: Wed, 25 Dec 2019 07:37:34 GMT
I/System.out: {
I/System.out: 	body
I/System.out: }

POST

StateError (Bad state: Header already sent): 异步方法未添加同步关键字(await)

Single post
val postBody = "{\"name\":\"dou\"}"
//val file = File("README.md")//发送文件
//post(file.asRequestBody())

//val formBody = FormBody.Builder()//发送formdata
//        .add("name", "dou")
//        .build()
val request = Request.Builder()
    .url(baseurl)
    .post(postBody.toRequestBody())
    .build()
client.newCall(request).execute().use { response ->
    if (!response.isSuccessful) throw IOException("Unexpected code $response")

    for ((name, value) in response.headers) {
        println("$name: $value")
    }
    println(response.body!!.string())
}
multipart post多类型数据上传
var logo = File("/sdcard/logo.png")

var requestBody = MultipartBody.Builder()
    .addFormDataPart("name", "dou")
    .addFormDataPart("image", "logo.png", logo.asRequestBody("image/png".toMediaType()))
    .build()

val request = Request.Builder()
    .url("${baseurl}/postmulti")
    .post(requestBody)
    .build()
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        e.printStackTrace()
    }

    override fun onResponse(call: Call, response: Response) {
        if (!response.isSuccessful) throw IOException("Unexpected code $response")

        for ((name, value) in response.headers) {
            println("name: $name, value: $value")
        }

        println("response: ${response.body?.string()}")
    }

})