java中http请求外部接口的时候传递sql语句过程记录
第一次做这种对接外部(第三方)接口的开发。记录一下:
介于保密的原因,外部接口就不公开了。我的需求是根据第三方提供的接口,查询数据。但是我的请求是包含了sql语句的。类似于下面这样的URL:
http://X.X.X.X/tb/re?select * from table where name=zhangsan
?前面的是他们提供的接口。后面是我传的sql语句,当然还需要你的用户名密码或者token。根据这个需求python可能几行代码就能搞定了,但是我使用的java,这个时候就感受到了python的简洁。
参考代码如下:
说明:
1.QUERYTB是我们的外部接口。
2.sql是我们要写的sql语句。
3.我没使用用户名密码登录,使用的是token所以换成token即可。
4.使用GET请求
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Base64; import java.util.List; import java.util.Map; import javax.swing.text.AbstractDocument.Content; import com.fasterxml.jackson.core.JsonParser; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.io.IOException; public class T { static String QUERY_TB = "http://。。。。";//外部接口 static String QUERY_SQL = "?sql=。。。。"; static String para="&access_token=。。。。。。。"; static String uid = "123321456"; public static void main(String[] args) { try { String u="512571"; JSONArray j=test1(u).getJSONArray("data"); for (int i =0;i<j.size();i++) { JSONArray oo= (JSONArray) j.get(i); String one= (String) oo.get(0); String two= (String) oo.get(1); String three= (String) oo.get(2); System.out.println("1"+one+"2"+two+"3"+three); break; } } catch (IOException e) { e.printStackTrace(); } } public static JSONObject test1(String UID) throws IOException { URL url = new URL(QUERY_TB + QUERY_SQL+UID+para); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 设置请求方式 connection.setConnectTimeout(15000); connection.connect(); BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); String line = null; StringBuilder result = new StringBuilder(); while ((line = br.readLine()) != null) { // 读取数据 result.append(line); } br.close(); connection.disconnect(); JSONObject jsondata = JSONObject.fromObject(result.toString()); return jsondata; }
这里面也遇到了很多的问题:
1,就是我们发送请求的时候,不能像在写sql的时候来写sql语句,比如 select * from table,我们可以看到语句中出现了空格,在我们发送URL请求的时候是不能这么写的,如果这样写的话,就会报一个400的错误,400状态码就意味这服务器不能够了解我们的URL地址,也就是我们URL地址出现错误。有人可能就问,为什么我同样把相同的连接粘入到浏览器为什么能正常访问接口里的数据呢?究其原因是我们在使用浏览器访问我们的URL的时候,会自动帮我们把空格去掉,所以能正常访问。
那我们怎么把连接放入到我们的URL请求里呢?我们按照正常的写法来写sql语句,但是在出现空格的地方我们使用20%来填补空格,然后再传进去就可以了,如果需要用到单引号,我们是使用27%来代替的,如果出现上面那个错误,最笨的方法就是把连接粘贴到浏览器,浏览器就自动给我们替补上对应的占位符来填补不同的字符。
2,怎么取到里面的数据就参考代码吧,我这个还是有点困难的,因为返回的不是json数据,也简单做了一下处理。