Java JSF项目使用Http post 调用外部接口传送信息

公司JSF项目最早的注释时间为2008年。非常老而且稳定的项目需要使用Post请求来进行外部接口的调用,遇到了很多问题。

第一次尝试:

直接在项目中书写http请求代码。网上粘贴出的代码,脱敏后



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;

import net.sf.json.JSONObject;

public class contect_flask {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
        JSONObject jsonObject1= new JSONObject();//post传递的参数
		infoJson.put("name", "value");
		System.out.println("最终获得的信息为=" + post(jsonObject1,"http://255.255.255.1"));
		
	}
	
	public static String post(JSONObject json, String url){
		String result = "";
		HttpPost post = new HttpPost(url);
		try{
			CloseableHttpClient httpClient = HttpClients.createDefault();
        
			post.setHeader("Content-Type","application/json;charset=utf-8");
			post.addHeader("Authorization", "Basic YWRtaW46");
			StringEntity postingString = new StringEntity(json.toString(),"utf-8");
			post.setEntity(postingString);
            //添加连接超时和相应超时设置
            RequestConfig requestConfig = RequestConfig.custom()  
			        .setConnectTimeout(5000)
			        .setConnectionRequestTimeout(1000)  
			        .setSocketTimeout(5000).build();  
			post.setConfig(requestConfig); 
			HttpResponse response = httpClient.execute(post);
			
			InputStream in = response.getEntity().getContent();
			BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
			StringBuilder strber= new StringBuilder();
			String line = null;
			while((line = br.readLine())!=null){
				strber.append(line+'\n');
			}
			br.close();
			in.close();
			result = strber.toString();
			if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){
				result = "服务器异常";
			}
		} catch (Exception e){
			System.out.println("请求异常");
			throw new RuntimeException(e);
		} finally{
			post.abort();
		}
//		HttpClient client = new DefaultHttpClient();
//		HttpPost post = new HttpPost(testUrl);
//		
//		PostMethod postMethod = new PostMethod(testUrl);
//		// 必须设置下面这个Header
//	    postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
//	    String  toJson = infoJson.toString();
//	    try {
//			RequestEntity se = new StringRequestEntity(toJson ,"application/json" ,"UTF-8");
//			postMethod.setRequestEntity(se);
//			postMethod.setRequestHeader("Content-Type","application/json");
//		    //默认的重试策略
//		    postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
//		    postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);//设置超时时间
//		    int httpStatus = client.ex
//		    String str=postMethod.getResponseBodyAsString();
//		    T.console("str-------:"+str); 
//		} catch (UnsupportedEncodingException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		return result;
	}
}

实测此方法有效。需要完整的导入如下jar包。

httpclient-4.5.2.jar
httpcore-4.4.10.jar

commons-beanutils-1.9.3.jar
commons-collections-3.2.1.jar
commons-lang-2.6.jar
commons-logging-1.2.jar
ezmorph-1.0.6.jar

json-lib-2.4-jdk15.jar

包的导入必须完整,如果有缺失,回报错。

但是将代码放入JSF项目中,在post.setHeader post.addHeader报错误,说找不到方法,查明原因是因为项目中的httpclient的jar报版本太低,没有此类方法。若跟新项目和jar,会导致多台主机项目需要重新部署jar包,代价较大。所以没有用这个方法

第二次尝试

不能使用java的方法就得使用JSF自带的。计划在jsp页面中书写类似于jQuery的ajax方法来进行外部url接口的访问。但是由于jsf的post请求是请求后台代码的Bean的,不是用来请求外部网址的接口。所以没有继续研究下去。

JSF为我们提供了标签类的前台请求。

<f:metadata>
    <f:viewParam name="data" value="#{bean.data}" />
    <f:event type="preRenderView" listener="#{bean.process}" />
</f:metadata>
public void process() throws IOException {
    String message = "Hello! You have sent the following data: " + data;
    String json = new Gson().toJson(Collections.singletonMap("message", message));

    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext ec = context.getExternalContext();
    ec.setResponseContentType("application/json");
    ec.setResponseCharacterEncoding("UTF-8");
    ec.getResponseOutputWriter().write(json);
    context.responseComplete(); // Prevent JSF from rendering the view.
}

路径:http://www.it1352.com/48626.html

https://www.w3cschool.cn/java/jsf-ajax-helloworld.html

第三次尝试:

在《Java调用第三方http接口的方式》中找到了一种适用老版项目,不需要导入jar包的。通过JDK网络类Java.net.HttpURLConnection,比较原始,但是适合大多数java项目。

https://blog.csdn.net/zengqingshanzheng/article/details/95946252

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架一样,JSF定义了一套JSF标签 JSF的全称   1、Joint Strike Fighter (JSF)   2、Java Server Faces (JSF) Java Server Faces (JSF)   JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器端应用程序的开发。由于由Java Community Process (JCP) 推动,属于Java EE 5中的技术规范,而受到了厂商的广泛支持。   JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架一样,JSF定义了一套JSF标签,能够生成与JavaBean属性绑定在一起的HTML表单元素。从应用开发者的角度看,两种框架十分相似,但是JSF可能会得到更多的支持,因为JSFJava的标准。在未来的发展中,有可能所有的J2EE应用服务器都需要支持JSFJava Server Faces技术好处   引入了基于组件和事件驱动的开发模式,使开发人员可以使用类似于处理传统界面的方式来开发Web应用程序。提供了行为与表达的清晰分离。 不用特别的脚本语言或者标记语言来连接UI组件和Web层。JSF技术API被直接分层在Servlet API的顶端。 技术为管理组件状态提供一个丰富的体系机构、处理组件数据、确认用户输入和操作事件。 Java Server Faces应用程序   典型的JSF应用程序包含下列部分:   一组JSP页面   一组后台bean(为在一个页面上的UI组件定义的属性和函数的JavaBean组件)   应用程序配置资源文件(定义页面导航规则、配置bean和其它的自定义对象,如自定义组件)   部署描述文件( web.xml )   一组由应用程序开发者创建的自定义对象(有可能)   一些可能包含自定义组件、约束、转换器或者监听器的对象   为在页面中表现自定义对象的一组自定义tag   包含JSP页面的JSF应用程序也使用由为了表现UI组件和在页面上的其他对象的JSF技术而定义的标准的tag库。 Java Server Faces技术的重要开发框架 sun-ri、myfaces、icefaces、richfaces、seam

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值