`

9、访问WEB服务(REST)——ajax基础笔记

阅读更多

最其名的WEB服务实现是SOAP(简单对象访问协议)。SOAP是由W3C管理的规约,它是XML协议,对于如何调用远程过程给出了定义。

WSDL(Web服务描述语言)文档也是XML文档,描述了如何创建Web服务的客户。通过提供WSDL文档,Web服务提供者就能很轻松地为可能的客户创建客户端代码。WSDL和SOAP通过一同使用,不过不一定非得这亲,因为这两个规约是分维护的。

尽管人们在简化SOAP实现上做出了很大努力,但SOAP还是一个很难使用的技术,只有在跨平台互操作性确实是一个很重要的需求时才会作用SOAP。实现Web服务还有一种更简单的方法,称为REST(代表传输),它在开发人员中享有越来越高的知名度,这些开发人员一方面希望得到SOAP好处的80%,另一方面只希望付出SOAP代码的20%。

Yahoo!选择REST作为其公共Web服务的协议,Yahoo!认为基于REST的服务很容易理解,而且很推崇REST的“平易近人”,因为当前大多数编程语言都可以访问REST。实际上,Yahoo!相信,与SOAP相比,REST的门槛更低,使用也更容易。

通过使用REST,建立请求时可以先指定一个服务入口URL,再向查询串追加搜索参数。服务将结果返回为XML文档。

XMLHttpRequest对象非常适合作为基于REST的Web服务的客户。使用XMLHttpRequest对象,可以向Web服务异步地发出请求,并解析得到XML响应。对于Yahoo!返回响应,则使用JavaScriptDOM方法解析响应,并向页面动态地提供结果数据。

问WEB服务(REST)

示例展示了如何使用Ajax技术访问Yahoo!Web服务,并向页面提供结果。页面上的文本字段允许用户指定搜索项。用户可以使用选择框来指定需要显示多少个结果。点击Submit按键就能启动搜索。

但是XMLHttpRequest对象只能访问发起文档所在域的资源。这里的解决办法,就是建立Yah!的网关,它与XMLHttpRequest脚本在同一个域中,由网关接收来自XMLHttpReqest对象的请求,并把它转发到Yahoo!Web服务。Yahoo!做出响应返回结果,网关再把结果路由传送到浏览器。通过使用这种方法,就能避免使用浏览器特定的JavaScript。

 

以下是搜索1条“ajax”时Yahoo!返回的XML:

<?xml version="1.0" encoding="UTF-8"?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:srch" xsi:schemaLocation="urn:yahoo:srch http://api.search.yahoo.com/WebSearchService/V1/WebSearchResponse.xsd" type="web" totalResultsAvailable="257000000" totalResultsReturned="1" firstResultPosition="1" moreSearch="/WebSearchService/V1/webSearch?query=ajax&amp;appid=thunderboltsoftware&amp;region=us">
    <Result>
        <Title>AJAX - Wikipedia</Title>
        <Summary>Background about the web development technique for creating interactive web applications.</Summary>
        <Url>http://en.wikipedia.org/wiki/AJAX</Url>
        <ClickUrl>http://en.wikipedia.org/wiki/AJAX</ClickUrl>
        <DisplayUrl>en.wikipedia.org/wiki/AJAX</DisplayUrl>
        <ModificationDate>1255590000</ModificationDate>
        <MimeType>text/html</MimeType>
        <Cache>
            <Url>http://uk.wrs.yahoo.com/_ylt=A0PDB2P12tpKixsAiH7dmMwF;_ylu=X3oDMTBwOHA5a2tvBGNvbG8DdwRwb3MDMQRzZWMDc3IEdnRpZAM-/SIG=16lq3593n/EXP=1255943285/**http%3A//66.218.69.11/search/cache%3Fei=UTF-8%26appid=thunderboltsoftware%26type=all%26query=ajax%26results=1%26ts=1255856883765%26u=en.wikipedia.org/wiki/AJAX%26d=TGfjPd29Tpo6%26icp=1%26.intl=us</Url>
            <Size>70721</Size>
        </Cache>
    </Result>
</ResultSet><!-- ws03.ydn.gq1.yahoo.com uncompressed/chunked Sun Oct 18 02:08:05 PDT 2009 -->

 

yahooSearch.html清单:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Yahoo! Search Web Services</title>

<script type="text/javascript">
var xmlHttp;

function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } 
    else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
}
//程序入口
function doSearch() {
    var url = "YahooSearchGateway?" + createQueryString() + "&ts=" + new Date().getTime();
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
}

function createQueryString() {
    var searchString = document.getElementById("searchString").value;
    searchString = escape(searchString);
    
    var maxResultsCount = document.getElementById("maxResultCount").value;

    var queryString = "query=" + searchString + "&results=" + maxResultsCount;
    return queryString;
}
    
function handleStateChange() {
    if(xmlHttp.readyState == 4) {
        if(xmlHttp.status == 200) {
            parseSearchResults();
        }
        else {
            alert("Error accessing Yahoo! search");
        }
    }
}
//回调函数
function parseSearchResults() {
    var resultsDiv = document.getElementById("results");
    while(resultsDiv.childNodes.length > 0) {
        resultsDiv.removeChild(resultsDiv.childNodes[0]);
    }

    document.write(xmlHttp.responseText);
    var allResults = xmlHttp.responseXML.getElementsByTagName("Result");
    var result = null;
    for(var i = 0; i < allResults.length; i++) {
        result = allResults[i];
        parseResult(result);
    }
}

function parseResult(result) {
    var resultDiv = document.createElement("div");
    
    var title = document.createElement("h3");
    title.appendChild(document.createTextNode(getChildElementText(result, "Title")));
    resultDiv.appendChild(title);
    
    var summary = document.createTextNode(getChildElementText(result, "Summary"));
    resultDiv.appendChild(summary);
    
    resultDiv.appendChild(document.createElement("br"));
    var clickHere = document.createElement("a");
    clickHere.setAttribute("href", getChildElementText(result, "ClickUrl"));
    clickHere.appendChild(document.createTextNode(getChildElementText(result, "Url")));
    resultDiv.appendChild(clickHere);
    
    document.getElementById("results").appendChild(resultDiv);
}

function getChildElementText(parentNode, childTagName) {
    var childTag = parentNode.getElementsByTagName(childTagName);
    return childTag[0].firstChild.nodeValue;
}
</script>
</head>

<body>
  <h1>Web Search Using Yahoo! Search Web Services</h1>
  
  <form action="#">
    Search String: <input type="text" id="searchString"/>
    
    <br/><br/>
    Max Number of Results:
    <select id="maxResultCount">
        <option value="1">1</option>
        <option value="10">10</option>
        <option value="25">25</option>
        <option value="50">50</option>
    </select>
    
    <br/><br/>
    <input type="button" value="Submit" onclick="doSearch();"/>
  </form>
  
  <h2>Results:</h2>
  <div id="results"/>

</body>
</html>

 

YahooSearchGatewayServlet.java清单:

package ajaxbook.chap4;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.*;
import javax.servlet.http.*;

public class YahooSearchGatewayServlet extends HttpServlet {
    private static final String YAHOO_SEARCH_URL = 
        "http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=thunderboltsoftware"
        + "&type=all";
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        String url = YAHOO_SEARCH_URL + "&" + request.getQueryString();
        
        HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection();
        con.setDoInput(true);
        con.setDoOutput(true);
        
        con.setRequestMethod("GET");
        
        //Send back the response to the browser
        response.setStatus(con.getResponseCode());
        response.setContentType("text/xml");
        
        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String input = null;
        OutputStream responseOutput = response.getOutputStream();
        
        while((input = reader.readLine()) != null) {
            responseOutput.write(input.getBytes());
        }
    
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
}

 

基于REST的Web服务结合使用时,Ajax技术相当强大。如果想在你自己的域中访问Web服务,用JavaScript就可以完成。否则,当访问其他域的资源时,就要创建外部资源的某种网关,这样就能避免浏览器安全沙箱问题。

 

运行结果:

 



 

 

 

 

  • 大小: 8.4 KB
分享到:
评论

相关推荐

    深入体验Java Web开发内幕——核心基础

    Java Web开发也涉及Web服务的创建,如SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)。RESTful API已经成为现代Web应用的主流设计风格,使用HTTP协议的CRUD操作,通过URI定位资源...

    WEB框架——REST原理(架构风格与基于网络的软件架构设计)

    **REST(Representational State Transfer,表述性状态转移)**是一种软件架构风格,广泛应用于Web服务的设计,特别是互联网应用程序。REST风格的架构强调简洁、高效和可扩展性,它基于HTTP协议,利用其固有的方法...

    Ajax访问dataSnap Rest服务器

    dataSnap Rest 跨平台的特性众主要是靠JSON来传输数据,通过HTTP,HTTPS 访问方法来获取所得到的数据. 技术牛人小满的作品。谢谢作者。共享给各位。

    .NET Web服务 入门经典 —— C# 编程篇

    《.NET Web服务 入门经典 —— C# 编程篇》这本书是为初学者设计的,旨在帮助读者快速掌握使用C#语言构建.NET Web服务的基础知识。Web服务是一种跨平台、跨应用程序的方式,通过互联网交换数据和实现功能。在C#中,...

    WEB服务——原理与技术

    ### WEB服务——原理与技术 #### 一、WEB服务概述 在信息技术领域,Web服务(Web Service)是一种软件系统的设计模式,它通过网络提供应用程序之间的交互接口,支持不同平台、不同语言的应用程序间的通信和数据...

    REST服务构建的web应用的优势和不足

    真正潜在风险存在于 REST 灵活的使用方式上,既可以被服务器端调用又能被客户端调用,所以一开始就要明确地区分用户访问权限和系统访问权限,区分 Web 页面权限和 REST 服务权限,但有时在开发中经常混为一谈,所以...

    基于 REST 的 Web 服务:基础

    【REST基础原理详解】 REST(Representational State Transfer,代表性状态转移)是一种网络应用程序的设计风格和开发方式,主要用于构建Web服务。这种设计模式强调简洁、直接的交互方式,以提高效率和可扩展性。...

    activit6-rest用ajax如何访问-base64加密

    标题"activit6-rest用ajax如何访问-base64加密"主要涵盖了两个关键点:一是如何使用Ajax访问Activiti6的REST接口,二是如何使用Base64对数据进行加密处理。 1. Ajax访问Activiti6 REST接口: - **创建Ajax请求**:...

    实战Web Service —— 使用Apache CXF开发Web服务的教程

    **实战Web Service —— 使用Apache CXF开发Web服务的教程** Apache CXF是一个开源的Java框架,用于构建和部署Web服务。本教程将带你深入理解如何利用CXF来开发高效、灵活的Web服务。我们将从基础概念开始,逐步...

    REST 基础(二):Web 服务编程,REST 与 SOAP

    在本篇博客“REST基础(二):Web服务编程,REST与SOAP”中,我们将深入探讨两种主要的Web服务编程模型:Representational State Transfer (REST) 和 Simple Object Access Protocol (SOAP)。这两种技术都是用于构建...

    Web编程入门——字节跳动.zip

    Web编程入门是初学者踏入互联网...综上所述,"Web编程入门——字节跳动"的课程内容可能覆盖了从基础到进阶的Web开发知识,适合对Web开发感兴趣的新手入门。通过深入学习和实践,你将能够独立创建功能完备的Web应用。

    jQuery Ajax调用Web服务代码

    在IT领域,jQuery、Ajax和Web服务是三个关键概念,它们在构建动态和交互式的Web应用程序中发挥着重要作用。本文将深入探讨jQuery的Ajax功能以及如何利用它来调用Web服务。 首先,jQuery是一个轻量级的JavaScript库...

    WebGIS从基础到开发实践代码(基于ArcGIS API for JavaScript)

    1.3REST及REST风格的Web服务 1.3.1REST中的基础知识 1.3.2REST风格的Web服务 1.3.3REST风格的Web服务实例 1.4Web GIS的组成 1.5ArcGIS Server REST风格的Web服务 1.5.1ArcGIS S erver站点的架构 1.5.2ArcGIS Server...

    基于Ajax与REST的WebServices研究与实现

    基于Ajax与REST的WebServices研究与实现 很不错的一篇硕士文章

    Visual C#.NET中文版Web服务开发基础

    6. **SOAP与REST的区别**:理解两种主要的Web服务通信风格——SOAP(简单对象访问协议)和REST(表述性状态转移)的异同,以及何时选择哪种方式。 7. **Web服务的安全性**:Web服务的安全性是开发过程中必须考虑的...

    Ajax调用webservices

    Web服务通常提供SOAP(Simple Object Access Protocol)或REST(Representational State Transfer)接口。在本例中,我们假设Web服务采用RESTful API,返回JSON格式的数据。若Web服务是SOAP接口,我们需要处理XML...

    基于REST的Web服务客户端.rar

    客户端通常需要构建URL来访问特定的Web服务资源,URL应包含资源的标识符。例如,`http://example.com/users/123`表示用户ID为123的资源。在请求中,可能还需要携带额外的HTTP头,如Content-Type定义数据格式,或者...

Global site tag (gtag.js) - Google Analytics