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. EasyUI DataGrid可编辑单元格

    效果如图: 首先在需要可编辑的列上添加一个editor属性,列定义为numberbox编辑类型 <th field="SCORES" editor="{type:' ...

  2. 技巧JS

    1.     document.referrer可以获得上一页的地址,使用document.anchors获得页面上面所有的链接元素,而不必使用document.getElementsByTagNam ...

  3. win下如何查看那个网络端口被那个应用程序使用

    在运行里面键入cmd打开命令行窗口.     在命令行窗口键入命令: netstat -ano 第一和第二列是自己网络的端口和外网连接的端口,pid:(全称Process Identification ...

  4. [Django] 问题记录追踪表

    关注的网站: https://simpleisbetterthancomplex.com/ Linux部署 1. Ubuntu下vsftpd安装部署 2. Utuntu下Django+Apache+W ...

  5. 【vijos】1791 骑士的旅行(特殊的技巧)

    https://vijos.org/p/1791 暴力的话只想到bfs,然后估计是状态超了才得20分. 噗,为啥暴力就不能想得简单点QAQ.....这种思想很好啊. 这一题我看了题解后不得不说我竟然没 ...

  6. linux 安装php 然后跟nginx整合

    php-fpm安装配置 nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理 ...

  7. 【原】eclipse使用技巧之代码编辑器分隔窗口

    相信很多使用Intellj IDE的朋友对其split screen功能赞赏有加!其实在eclipse中也可以方便地代码编辑多windows.多views!但是隐藏的有点深,很多朋友不常用到,甚至以为 ...

  8. JZOJ.5274【NOIP2017模拟8.14】数组

    Description

  9. [LintCode] 有效回文串

    class Solution { public: /** * @param s A string * @return Whether the string is a valid palindrome ...

  10. 如何查看python的api

    如何查看python selenium的api   经常发现很多同学装好了python+selenium webdriver开发环境后不知道怎么去查看api文档,在这里乙醇简单介绍一下具体方法,其实非 ...