輸入網址返回json字符串,並用httpclient去調用,spingmvc處理httpclient傳過來的參數


雖然簡單,但是我這記性着實算不上好,還是在此記錄下吧。

新建web工程,如下

導入需要的jar包:

用於支持json springmvc spring  httpclient  log4j

開始編寫web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    
    <!-- 配置DispatchcerServlet -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j.properties</param-value>
    </context-param>
    <!-- 60s 檢測日志配置 文件變化 -->
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>
 
    <!-- 配置Log4j監聽器 -->
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置Spring mvc下的配置文件的位置和名稱 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
</web-app>

web.xml中加載了log4j.properties和springmvc.xml兩個配置文件 ,這兩個配置文件都是放在src下面的,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
        <!-- 注解驅動 -->
        <context:annotation-config />  
        <mvc:annotation-driven />
        <mvc:resources mapping="/js/**" location="/js/" />
        <!-- 配置自動掃描的包 -->
        <context:component-scan base-package="com.jackie.springmvc"></context:component-scan>
        
        <!-- 配置視圖解析器 如何把handler 方法返回值解析為實際的物理視圖 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name = "prefix" value="/WEB-INF/views/"></property>
            <property name = "suffix" value = ".jsp"></property>
        </bean>
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <!--json視圖攔截器,讀取到@ResponseBody的時候去配置它-->
                    <ref bean="mappingJacksonHttpMessageConverter"/>
                </list>
            </property>
        </bean>
        <!--json轉化器,它可以將結果轉化-->
        <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json;charset=UTF-8</value>
                </list>
            </property>
        </bean>
</beans>
### \u8BBE\u7F6E###
log4j.rootLogger = INFO,stdout,D,E

### \u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### \u8F93\u51FADEBUG \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### \u8F93\u51FAERROR \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

現在開始寫java代碼

package com.jackie.springmvc.handlers;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloWorld {
    Map<String ,String> map = new HashMap<String ,String>();
    
    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    /**
     * 1. 使用RequestMapping注解來映射請求的URL
     * 2. 返回值會通過視圖解析器解析為實際的物理視圖, 對於InternalResourceViewResolver視圖解析器,會做如下解析
     * 通過prefix+returnVal+suffix 這樣的方式得到實際的物理視圖,然后會轉發操作
     * "/WEB-INF/views/success.jsp"
     * @return
     */
    @ResponseBody
    @RequestMapping("/helloworld")
    public Map<String ,String> hello(){
        public Map<String ,String> hello(){
        map.put("username", "seven1");
        map.put("password", "seven2");
        map.put("message", "seven3");
        return map;
    } } @RequestMapping(
"/helloworld1") //因為springmvc.xml中配置了視圖解析器,所以可以跳轉到/WEB-INF/views/success.jsp public String hello1(){ return "success"; } }

現在放到Tomcat里面跑起來,在瀏覽器中輸入http://localhost:8080/myProj/helloworld

效果如圖:

第一步完成了,現在寫httpclient去獲取這個json字符串

package com.jackie.springmvc.handlers;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;


import net.sf.json.JSONObject;

public final class Send {
    private static Logger logger = Logger.getLogger(Send.class);  
    /**
     * 發送消息給指定的url
     * @return
     */
    public  String sendSms(String url, Map<String,String> map,String encoding){  
        //獲取HttpClient請求,替換掉已被棄用的new DefaultHttpClient()方法
        CloseableHttpClient  httpclient = HttpClientBuilder.create().build();
        //配置對象
        RequestConfig config = RequestConfig.custom().setConnectTimeout(60000).setSocketTimeout(15000).build();
        HttpPost httppost = new HttpPost(url);  
        httppost.setConfig(config);
        String strResult = "";  
        CloseableHttpResponse  response =null;  
        try {  
                //裝填參數
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                if(map!=null){
                    for (Entry<String, String> entry : map.entrySet()) {
                        nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                    }
                }
            
                httppost.addHeader("Content-type", "application/x-www-form-urlencoded");  
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,encoding));  
                 
                response = httpclient.execute(httppost);  
                if (response.getStatusLine().getStatusCode() == 200) {
                    /*讀返回數據*/  
                    String conResult = EntityUtils.toString(response.getEntity(),encoding); 
                    logger.info("發送成功,返回數據為:"+conResult);
                    //解析返回數據
                    JSONObject sobj = new JSONObject();  
                    sobj = JSONObject.fromObject(conResult);  
                    String result = sobj.getString("username"); 
                    logger.info("result="+result);
                } else {  
                    
                    String err = response.getStatusLine().getStatusCode()+"";  
                    strResult += "發送請求失敗:"+err;  
                    logger.error("發送失敗");
                }  
        } catch (ClientProtocolException e) {  
            e.printStackTrace();
            logger.error("進入catch,捕獲ClientProtocolException異常:"+e);
        } catch (IOException e) {  
            e.printStackTrace();  
            logger.error("進入catch,捕獲IOException異常:"+e);
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.error("進入finally中response不為空的情況,捕獲IOException異常:"+e);
                }
            }
            if (httpclient != null) {
                try {
                    httpclient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.error("進入finally中httpclient不為空的情況,捕獲IOException異常:"+e);
                }
            }
        }  
          
        return strResult;  
    }  
    public static void main(String[] args) {
        Send send = new Send();
        Map<String, String> map = new HashMap<String, String>();
        map.put("message1", "message11");
        map.put("message2", "message21");
        map.put("message3", "message31");
        String smsUrl="http://localhost:8080/myProj/helloworld";
        String message = send.sendSms(smsUrl, map,"utf-8");
    }
}

運行main函數,日志正常打出

該如何獲取message1,message2,message3這些消息呢

這里用的是流

在HelloWorld這個類里添加一個方法hello7

    @ResponseBody
    @RequestMapping(value="/helloworld7")
    public JSONObject hello7(InputStream is, String charset) throws UnsupportedEncodingException, IOException {
        String pageString = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        StringBuffer sb = null;
        JSONObject sobj = new JSONObject();  
        charset="UTF-8";
        try {
            isr = new InputStreamReader(is, charset);
            br = new BufferedReader(isr);
            sb = new StringBuffer();
            Map map = new HashMap();
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            pageString = sb.toString();
            String[] message = pageString.split("&");
            for(int i = 0;i<message.length;i++) {
                String[] subMessage = message[i].split("=");
                map.put(subMessage[0], subMessage[1]);
            }
            map.put("seven", "happy");
            sobj = JSONObject.fromObject(map);  
            String result = sobj.getString("message1"); 
            logger.info("result="+result);
            logger.info("pageString="+pageString);
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null){
                    is.close();
                }
                if(isr!=null){
                    isr.close();
                }
                if(br!=null){
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            sb = null;
        }
        return sobj;
    }

然后在將Send類里的main函數smsUrl改為http://localhost:8080/myProj/helloworld7,運行main函數,結果如下:

控制台1:

控制台2:

鐺鐺鐺~完成啦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM