GET示例
建立服务端
- python文件服务器,在桌面创建一文本1.txt,然后执行python命令
pyhton -m http.server 3344
.
Serving HTTP on 0.0.0.0 port 3344 (http://0.0.0.0:3344/) ...
- 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()}")
}
})