0 概述

在写app后台的时候,需要调用另一个服务器上的算法服务,所以需要发送http请求来获取结果。

考虑到一个功能(比如智能中医)需要调用好几个接口(人脸识别,舌苔识别,饮食推荐),大部分时间花在等待接口的处理上,如果一个接一个地调用,耗时比较长。

所以使用多线程来处理这几个接口调用,以此减少消耗时间。(在发送一个请求后不盲等,继续发送另一个请求,这相当于一种异步请求)

1 post请求

/**
*
* @param url:http接口地址
* @param param:传入参数,格式为?param1=xxx&param2=xxx,如果值xxx含有特殊字符,可以用param = "image=" + URLEncoder.encode(image,"utf-8");
* @return: 返回调用接口得到的json字符串(是否为json字符串决定于http接口),是json字符串则可以进行相应解析,Map<String,Object> moodRes = (Map<String,Object>)JSONObject.parse(result)
* @throws Exception
*/
public static String postRequest(String url, String param) throws Exception{
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)httpUrl.openConnection();
conn.setRequestMethod("POST"); conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
} } catch (Exception e) {
throw e;
}finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}

2 get请求

public static String getRequest(String url) throws Exception{
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection)urlGet.openConnection();
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true); System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 http.connect(); InputStream is = http.getInputStream();
int size = is.available(); byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8"); is.close(); } catch (Exception e) {
e.printStackTrace();
}
return message;
}

3 json解析

http请求得到的一般是json格式的字符串,利用json包解析成需要的结果,不同json包解析方法有所不同。

import net.sf.json.JSONObject;
JSONObject jsonObj = JSONObject.fromObject(jsonStr);
String res1 = jsonObj.getString("key1");
int res2 = jsonObj.getInt("key2"); ////////////////////////////////////////////////////////////////////////////////// import com.alibaba.fastjson.JSONObject;
Map<String,Object> jsonObj = (Map<String,Object>)JSONObject.parse(jsonStr);
String res1 = (String)jsonObj.get("key1");
int res2 = (Integer)jsonObj.get("key2");

4 多线程

//用线程池发送请求
ExecutorService executor = Executors.newFixedThreadPool(3);
//问诊
Question taskForQuestion = new Question(symptom);
Thread t1 = new Thread(taskForQuestion);
executor.execute(t1); //人脸望诊
taskForFace = new LookForFace(facePath);
Thread t2 = new Thread(taskForFace);
executor.execute(t2); //舌苔望诊
taskForTongue = new LookForTongue(tonguePath);
Thread t3 = new Thread(taskForTongue);
executor.execute(t3); //等待线程执行完毕,每一个task都发送了请求并获取结果解析后放到task中的某个变量中,执行完后就可以获得这些变量来获得所要的结果
executor.shutdown();
while(!executor.isTerminated()) {
}

java发送http请求和多线程的更多相关文章

  1. Java发送Http请求并获取状态码

    通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...

  2. 通过java发送http请求

    通常的http请求都是由用户点击某个连接或者按钮来发起的,但是在一些后台的Java程序中需要发送一些get或这post请求,因为不涉及前台页面,该怎么办呢? 下面为大家提供一个Java发送http请求 ...

  3. Java发送HTTPS请求

    前言 上篇文章介绍了 java 发送 http 请求,大家都知道发送http是不安全的 .我也是由于对接了其他企业后总结了一套发送 https的工具.大家网上找方法很多的,但是可不是你粘过来就能用啊, ...

  4. 使用Java发送Http请求的内容

    公司要将自己的产品封装一个WebService平台,所以最近开始学习使用Java发送Http请求的内容.这一块之前用PHP的时候写的也比较多,从用最基本的Socket和使用第三方插件都用过. 学习了J ...

  5. JAVA发送HttpClient请求及接收请求结果

    1.写一个HttpRequestUtils工具类,包括post请求和get请求 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  6. Java发送socket请求的工具

    package com.tech.jin.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import ...

  7. Java发送Http请求

    package com.liuyu.test; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...

  8. 编写爬虫(spider)的预备知识:用java发送HTTP请求

    使用原生API来发送http请求,而不是使用apache的库,原因在于这个第三方库变化实在太快了,每个版本都有不小的变化.对于程序员来说,使用它反而会有很多麻烦,比如自己曾经写过的代码将无法复用. 原 ...

  9. Java发送post请求

    package com.baoxiu.test; import java.io.BufferedReader;import java.io.InputStreamReader;import java. ...

随机推荐

  1. 用CSS调整scrollbar(滚动条)的配色

    可以通过调整CSS的方式,来给滚动条换色. 代码如下: .uicss-cn{ height:580px;overflow-y: scroll; scrollbar-face-color:#EAEAEA ...

  2. 第二百三十节,jQuery EasyUI,后台管理界面---后台管理

    jQuery EasyUI,后台管理界面---后台管理 一,admin.php,后台管理界面 <?php session_start(); if (!isset($_SESSION['admin ...

  3. 第一百五十一节,封装库--JavaScript,表单验证--密码确认验证--回答验证--电子邮件验证加自动补全

    封装库--JavaScript,表单验证--密码确认验证--回答验证--电子邮件验证加自动补全 效果图 html <div id="reg"> <h2 class ...

  4. 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败解决方案

    第一种方法测试过可用:地址:http://download.csdn.net/detail/itjjfamily/8853509 下面是第二种: .NET导出Excel遇到的80070005错误的解决 ...

  5. 【转】防止CListCtrl闪烁的几种方法

    转载出处:http://blog.sina.com.cn/s/blog_5ee42ba30100g50j.html 1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘 m_ctlLis ...

  6. 一个简单的flask应用

    一个简单的flask应用,文件名hello.py from flask import Flask app = Flask(__name__) @app.route('/') def hello_wor ...

  7. MAMP下配置虚拟主机域名

    第一步:修改虚拟主机地址: /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf 第二步:

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  9. RadioButton ---- 样式效果切换

    \res\drawable\radio_button_bg.xml <?xml version="1.0" encoding="utf-8"?> & ...

  10. 170111、MapperScannerConfigurer处理过程源码分析

    前言 本文将分析mybatis与spring整合的MapperScannerConfigurer的底层原理,之前已经分析过java中实现动态,可以使用jdk自带api和cglib第三方库生成动态代理. ...