導航:首頁 > 編程語言 > javaresponseapi

javaresponseapi

發布時間:2023-08-02 14:44:04

1. java 如何模擬瀏覽器調用rest api介面

packagecom.demo;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;

importjavax.xml.bind.DatatypeConverter;

importorg.apache.http.HttpResponse;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.impl.client.DefaultHttpClient;
publicclassrestTest{
publicstaticvoidmain(String[]args){
try{
DefaultHttpClientClient=newDefaultHttpClient();

HttpGethttpGet=newHttpGet("你的地址");
Stringencoding=DatatypeConverter.printBase64Binary("admin:admin".getBytes("UTF-8"));

httpGet.setHeader("Authorization","Basic"+encoding);

HttpResponseresponse=Client.execute(httpGet);

System.out.println("response="+response);

BufferedReaderbreader=newBufferedReader(newInputStreamReader(response.getEntity().getContent()));
StringBuilderresponseString=newStringBuilder();
Stringline="";
while((line=breader.readLine())!=null){
responseString.append(line);
}
breader.close();
StringrepsonseStr=responseString.toString();

System.out.println("repsonseStr="+repsonseStr);

}catch(IOExceptione){
e.printStackTrace();
}

}
}

2. 使用java開源工具httpclient怎麼使用

使用java開源工具httpClient及jsoup抓取解析網頁數據
來源:iteye,原文
今天做項目的時候遇到這樣一個需求,需要在網頁上展示今日黃歷信息,數據格式如下
公歷時間:2016年04月11日星期一
農歷時間:猴年三月初五
天乾地支:丙申年壬辰月癸亥日
宜:求子祈福開光祭祀安床
忌:玉堂(黃道)危日,忌出行
主要包括公歷/農歷日期,以及忌宜信息的等。但是手裡並沒有現成的數據可供使用,怎麼辦呢?革命前輩曾經說過,沒有槍,沒有炮,敵(wang)人(luo)給我們造!網路上有很多現成的在線萬年歷應用可供使用,雖然沒有現成介面,但是我們可以伸出手來,自己去拿。也就是所謂的數據抓取。
這里介紹兩個使用的工具,httpClient以及jsoup,簡介如下:
HttpClient是ApacheJakartaCommon下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。HttpClient已經應用在很多的項目中,比如ApacheJakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。
httpClient使用方法如下:
1.創建HttpClient對象。
2.創建請求方法的實例,並指定請求URL。
3.調用HttpClient對象的execute(HttpUriRequestrequest)發送請求,該方法返回一個HttpResponse。
4.調用HttpResponse相關方法獲取相應內容。
5.釋放連接。
jsoup是一款Java的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
需要更多信息可以參見官網下載地址
httpClient:http://hc.apache.org/httpcomponents-client-5.0.x/index.html
jsoup:http://jsoup.org/
接下來我們直接上代碼,這里我們抓取2345在線萬年歷的數據http://tools.2345.com/rili.htm
首先我們定義一個實體類Almanac來存儲黃歷數據
Almanac.java1packagecom.likx.picker.util.bean;2
3/**4
*萬年歷工具實體類5
*
6
*@author溯源blog7
*2016年4月11日8
*/9publicclassAlmanac{10
privateStringsolar;
/*陽歷e.g.2016年4月11日星期一*/11
privateStringlunar;
/*陰歷e.g.猴年三月初五*/12
privateStringchineseAra;
/*天乾地支紀年法e.g.丙申年壬辰月癸亥日*/13
privateStringshould;
/*宜e.g.求子祈福開光祭祀安床*/14
privateStringavoid;
/*忌e.g.玉堂(黃道)危日,忌出行*/1516
publicStringgetSolar(){17
returnsolar;18
}1920
publicvoidsetSolar(Stringdate){21
this.solar=date;22
}2324
publicStringgetLunar(){25
returnlunar;26
}2728
publicvoidsetLunar(Stringlunar){29
this.lunar=lunar;30
}3132
publicStringgetChineseAra(){33
returnchineseAra;34
}3536
publicvoidsetChineseAra(StringchineseAra){37
this.chineseAra=chineseAra;38
}3940
publicStringgetAvoid(){41
returnavoid;42
}4344
publicvoidsetAvoid(Stringavoid){45
this.avoid=avoid;46
}4748
publicStringgetShould(){49
returnshould;50
}5152
publicvoidsetShould(Stringshould){53
this.should=should;54
}5556
publicAlmanac(Stringsolar,Stringlunar,StringchineseAra,Stringshould,57
Stringavoid){58
this.solar=solar;59
this.lunar=lunar;60
this.chineseAra=chineseAra;61
this.should=should;62
this.avoid=avoid;63
}64}
然後是抓取解析的主程序,寫程序之前需要在官網下載需要的jar包
AlmanacUtil.javapackagecom.likx.picker.util;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;importorg.apache.http.HttpEntity;importorg.apache.http.ParseException;importorg.apache.http.client.ClientProtocolException;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;/***<STRONG>類描述</STRONG>:
2345萬年歷信息爬取工具<p>*
*@version1.0<p>*@author溯源blog*
*<STRONG>創建時間</STRONG>:2016年4月11日下午14:15:44<p>*<STRONG>修改歷史</STRONG>:<p>*<pre>*修改人
修改時間
修改內容*---------------
-------------------
-----------------------------------*</pre>*/publicclassAlmanacUtil{
/**
*單例工具類
*/
privateAlmanacUtil(){
}
/**
*獲取萬年歷信息
*@return
*/
publicstaticAlmanacgetAlmanac(){
Stringurl="http://tools.2345.com/rili.htm";
Stringhtml=pickData(url);
Almanacalmanac=analyzeHTMLByString(html);
returnalmanac;
}
/*
*爬取網頁信息
*/
privatestaticStringpickData(Stringurl){
CloseableHttpClienthttpclient=HttpClients.createDefault();
try{
HttpGethttpget=newHttpGet(url);
CloseableHttpResponseresponse=httpclient.execute(httpget);
try{
//獲取響應實體
HttpEntityentity=response.getEntity();
//列印響應狀態
if(entity!=null){
returnEntityUtils.toString(entity);
}
}finally{
response.close();
}
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(ParseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//關閉連接,釋放資源
try{
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
returnnull;
}
/*
*使用jsoup解析網頁信息
*/
(Stringhtml){
StringsolarDate,lunarDate,chineseAra,should,avoid="";
Documentdocument=Jsoup.parse(html);
//公歷時間
solarDate=getSolarDate();
//農歷時間
ElementeLunarDate=document.getElementById("info_nong");
lunarDate=eLunarDate.child(0).html().substring(1,3)+eLunarDate.html().substring(11);
//天乾地支紀年法
ElementeChineseAra=document.getElementById("info_chang");
chineseAra=eChineseAra.text().toString();
//宜
should=getSuggestion(document,"yi");
//忌
avoid=getSuggestion(document,"ji");
Almanacalmanac=newAlmanac(solarDate,lunarDate,chineseAra,should,avoid);
returnalmanac;
}
/*
*獲取忌/宜
*/
(Documentdoc,Stringid){
Elementelement=doc.getElementById(id);
Elementselements=element.getElementsByTag("a");
StringBuffersb=newStringBuffer();
for(Elemente:elements){
sb.append(e.text()+"");
}
returnsb.toString();
}
/*
*獲取公歷時間,用yyyy年MM月dd日EEEE格式表示。
*@returnyyyy年MM月dd日EEEE
*/
(){
Calendarcalendar=Calendar.getInstance();
DatesolarDate=calendar.getTime();
SimpleDateFormatformatter=newSimpleDateFormat("yyyy年MM月dd日EEEE");
returnformatter.format(solarDate);
}}
為了簡單明了我把抓取解析抽象成了幾個獨立的方法,
其中pickData()方法使用httpClient來抓取數據到一個字元串中(就是在網頁上點擊查看源代碼看到的HTML源碼),analyzeHTMLByString()方法來解析抓取到的字元串,getSuggestion方法把抓取方法類似的宜忌數據抽象到了一起,另外因為公歷時間可以很容易的自己生成就沒有在網頁上爬取。
然後下面是一個測試類簡單測試下效果:AlmanacUtilTest.javapackagecom.likx.picker.util.test;publicclassAlmanacUtilTest{
publicstaticvoidmain(Stringargs[]){
Almanacalmanac=AlmanacUtil.getAlmanac();
System.out.println("公歷時間:"+almanac.getSolar());
System.out.println("農歷時間:"+almanac.getLunar());
System.out.println("天乾地支:"+almanac.getChineseAra());
System.out.println("宜:"+almanac.getShould());
System.out.println("忌:"+almanac.getAvoid());
}}
運行結果如下:
集成到實際項目中效果是這樣的:
另外最近博客一直沒怎麼更新,因為最近考慮到技術氛圍的原因,離開了對日外包行業,前往一家互聯網公司就職。說一下最近的感受,那就是一個程序員最核心的競爭力不是學會了多少框架,掌握多少種工具(當然這些對於程序員也不可或缺),而是扎實的基礎以及快速學習的能力,比如今天這個項目,從對httpClient,jsoup工具一無所知到編寫出Demo代碼總計大概1個多小時,在之前對於我來說是不可想像的,在技術氛圍濃厚的地方快速get技能的感覺,非常好。
當然本例只是一個非常淺顯的小例子,網頁上內容也很容易抓取,httpClient及jsoup工具更多強大的地方沒有體現到,比如httpClient不僅可以發送get請求,而且可以發送post請求,提交表單,傳送文件,還比如jsoup最強大的地方在於它支持仿jquery的選擇器。本例僅僅使用了最簡單的document.getElementById()匹配元素,實際上jsoup的選擇器異常強大,可以說它就是java版的jquery,比如這樣:Elementslinks=doc.select("a[href]");//awithhrefElementspngs=doc.select("img[src$=.png]");
//imgwithsrcending.pngElementmasthead=doc.select("div.masthead").first();
//divwithclass=mastheadElementsresultLinks=doc.select("h3.r>a");//directaafterh3

3. 關於JAVA模擬發送post請求並響應內容

如果你是用java的api實現的模擬post請求,那麼你需要在你之前構造的http request的header里加上
Cookie:名字=值 然後統一專包裝成你的conenction的OutputStream。
建議你用屬apache的HttpClient api項目,裡面有專門處理cookie的api,這樣事情就簡單許多。

4. 在Java中怎麼獲得網頁狀態碼,比如:404等

StatusCode 似乎 Servelt API中,無論是 Filter Wrapper Reponse,都沒有提供 get的方法。
以下是一個從網上找到的解決方案。

1.先實現一個對Response的包裝器:
public class StatusExposingServletResponse extends HttpServletResponseWrapper {

private int httpStatus;

public StatusExposingServletResponse(HttpServletResponse response) {
super(response);
}

@Override
public void sendError(int sc) throws IOException {
httpStatus = sc;
super.sendError(sc);
}

@Override
public void sendError(int sc, String msg) throws IOException {
httpStatus = sc;
super.sendError(sc, msg);
}

@Override
public void setStatus(int sc) {
httpStatus = sc;
super.setStatus(sc);
}

public int getStatus() {
return httpStatus;
}

}

2, 然後實現一個Filter來替換原始的HttpServletResponse,這樣你就可以在Filter裡面取到statusCode了

public class StatusReportingFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
StatusExposingServletResponse response = new StatusExposingServletResponse((HttpServletResponse)res);
chain.doFilter(req, response);
int status = response.getStatus();
// report 在這兒你就得到狀態碼了。
}

public void init(FilterConfig config) throws ServletException {
//empty
}

public void destroy() {
// empty
}

}

5. 急急急!!!簡單問題,java的response和request用法,需要import那個包

servlet-api.jar這個包.在tomcat等伺服器中可找到此包.
request對象的主要方法有:
1. getAttribute( String name )
返回name指定的屬性值,如果指定的屬性值不存在,則會返回null值.
2. getAttributeNames()
返回request對象的所有屬性的名字,其結果是一個類舉(Enumeration)類的實例.
3. getCookies()
返回客戶端的Cookie對象,結果是一個Cookies數組.
4. getHeader( String name )
返回指定名字的request Header的所有值,其結果也是一個類舉類的實例.
5. getHeaderNames()
返回所有request Header 的名字,其結果也是一個類舉類的實例.
6. getMethod()
獲得客戶端向伺服器端傳送數據的方法,如get,post等.
7. getParameter( String name )
獲得客戶端傳送給伺服器的參數值,該參數是由name指定的.
8. getParameterNames()
返回客戶端傳給伺服器摘的所有參數的名字,其結果也是一個類舉類的實例.
9. getParameterValues( String name )
獲得指定參數的所有值,參數由name指定.
10. getProtocol()
獲得客戶端向伺服器端傳送數據所依據的協議的名稱.
11. getQueryString()
獲得查詢字元串,該字元串由客戶端以get方法向伺服器端傳送.
12. getRequestURI()
獲取發出請求字元串的客戶端的地址.
13. getRemoteAddr()
獲取客戶端的IP地址.
14. getRemoteHost()
獲取客戶端的名字.
15. getServerName()
獲取伺服器的名字.
16. getServerPort()
獲取伺服器的名字..
17. setAttribute( String name , java.lang.Object objt )
設置名字為name的request參數的值,該值是由java.lang.Object類型的objt指定

response對象的主要方法有:
1. addCookie( Cookie cook )
添加一個Cookie對象,用來保存客戶端用戶信息.
2. addHeader( String name , String value )
添加HTTP文件頭信息,該Header將傳到客戶端去,如果已經同的Header存在,則覆蓋已有的Header.
3. containsHeader( String name )
判斷指定名字的HTTP文件頭是否已經存在,然後返回真假布爾值.
4. sendError( int )
向客戶端發送錯誤的信息.
5. setHeader( String name , String value )
設置指定的HTTP文件的值,如果該值已經存在,則新值會覆蓋原有的舊值.

6. retrofit2.0+RxJava結合使用時,怎麼才能通過post請求返回一個response對象

1.首先定義帶泛型的返回結果,RetrofitAPI的原生結果映射為這種形式:classResult{StringResultMessage;intResultCode;TData;}2.處理錯誤的方法和@朱詩雄前輩方法差不多,放到作為靜態方法放到RetroUtil里,這里ApiException為自己定義的一個異常,放入錯誤碼和錯誤信息(錯誤碼不止一個):staticObservableflatResult(Resultresult){returnObservable.create(subscriber->{switch(result.ResultCode){caseConstants.SUCCESS_CODE:subscriber.onNext(result.Data);break;caseConstants.ERROR_CODE:subscriber.onError(newApiException(result.ResultCode,result.ResultMessage);break;default://}subscriber.onCompleted();}});}3.在API包裝類對於上述Result格式的返回結果,統一調用flatMap(RetroUtil::flatResult)後的API。這樣每個API的返回結果就是Observable的形式並且在errorHandler中統一處理錯誤了。//介面方法Observable>getUserInfo();//包裝後的方法ObservablegetUserInfo(){returnmApi.getUserInfo.flatMap(RetroUtil::flatResult);}//調用時apiWrapper.getUserInfo().subscrible(user->{//處理正常邏輯},error->{//處理錯誤邏輯和異常,這里封裝時通常也會統一處理,//提供一個默認的Action1參數,彈出//throwable的message列印日誌等});

閱讀全文

與javaresponseapi相關的資料

熱點內容
圓弧刀東槽如何編程 瀏覽:870
js怎麼單擊改變標簽里的文字 瀏覽:760
實例配置文件里的sid是什麼 瀏覽:43
ps文件模糊 瀏覽:192
葉檀財經推出過什麼購物APP 瀏覽:875
linux硬碟檢測 瀏覽:431
如何用路由器降低網路延遲 瀏覽:601
aix分區root密碼 瀏覽:439
運動鞋買鞋上什麼app 瀏覽:904
NSA工具下載 瀏覽:918
函數代碼在哪個文件夾 瀏覽:213
微信應用怎麼代碼添加快捷方式 瀏覽:371
用數據說話是最有力的什麼 瀏覽:27
圖片文件被鎖定無法打開 瀏覽:768
wr886nv2升級 瀏覽:490
移動硬碟視頻文件無法刪除 瀏覽:417
如何查看網路監控 瀏覽:132
列印機如何連接到網路列印機 瀏覽:181
vmlinux安裝tools 瀏覽:768
波形文件轉mp3 瀏覽:803

友情鏈接