游戏支付宝回调服务器配置 怎么建支付回调web

获取后台服务器数据
Windows8和Windows Phone8提供了用于通过HTTP协议发送和接受网络数据的类。在Windows8中为HttpClient类,Windows Phone中为WebClient和HttpWebRequest类。
Android系统包含两种HTTP Client:HttpURLConnection和Apache HTTP Client。蓝牙技术支持HTTPS协议,流方式上传和下载,请求超时配置,IPv6和连接池。
IOS SDK的NSURLRequest及其子类提供通过http协议发送和接受网络数据的功能。
Web 服务允许以编程方式访问 Internet 上的各种数据。数据服务是基于 HTTP 的 Web 服务,这种
Web 服务实现开放数据协议 (OData) 以将数据公开为资源,这些资源通过数据模型进行定义并通过统一资源标识符 (URI) 进行寻址。
Web 和数据服务都使用一种基于 XML 的开放式语言来描述其基于 Web 的 API。使用 Web 服务描述语言 (WSDL) 描述 Web 服务提供的服务。概念性架构定义语言 (CSDL) 描述数据服务提供的数据模型。有关更多信息,请参见&&和概念性架构定义文件格式。
因为在 Internet 上发布的绝大多数 Web 服务都基于 HTTP,因此您可以使用&HttpWebRequest&和&WebClient类从 Windows&Phone 应用访问 Web 服务。为了帮助减轻生成 Web 服务通常所需的其他代码的任务,可以使用服务模型代理生成工具 (SLsvcUtil.exe) 或 Visual Studio 的“添加服务引用”功能生成代理类。有关如何使用WebClient&类访问 RSS 源的示例,请参见&如何为 Windows Phone 创建基本的 RSS 读取器。
根据 Web 服务 WSDL 文件,Web 服务代理类为 Web 服务实现序列化、请求和响应代码。您可以在 Windows&Phone 应用中使用生成的代理类与相应的 Web 服务进行通信。
数据服务 (OData)
数据服务是基于 HTTP 的
Web 服务,该 Web 服务实现开放数据协议 (OData)
以将数据公开为资源,这些资源通过数据模型进行定义并通过 URI 进行寻址。这使您能够使用具象状态传输 (REST) 的语义(尤其是 GET、PUT、POST 和 DELETE 等标准
HTTP 谓词)访问和更改数据。
由于数据服务是基于 HTTP 的,因此您可以使用&HttpWebRequest&和&WebClient&类从 Windows&Phone 应用访问数据服务。为了帮助减轻生成数据服务所需其他代码的任务,您可以使用 WCF 数据服务客户端实用工具 DataSvcUtil.exe 或 Visual Studio 的“添加服务引用”功能生成一个基于数据服务 CSDL 文件的代理类。您可以在 Windows&Phone 应用中使用生成的代理类与相应的数据服务进行通信。
在WindowsPhone应用中可以使用 HttpWebRequest 和 WebClient 类访问 Web 服务。
提供用于将数据发送到由 URI 标识的资源及从这样的资源接收数据的常用方法。WebClient&类提供向 URI 标识的任何本地、Intranet 或 Internet 资源发送数据以及从这些资源接收数据的。WebClient&类使用&WebRequest&类提供对资源的访问。&WebClient&实例可以通过任何已向&WebRequest.RegisterPrefix&方法注册的&WebRequest&子代访问数据。
AllowReadStreamBuffering
获取或设置一个值,该值指示是否对从某一 WebClient 实例的 Internet 资源读取的数据进行缓冲处理
AllowWriteStreamBuffering
获取或设置一个值,该值指示是否对写入到 WebClient 实例的 Internet 资源的数据进行缓冲处理
BaseAddress
获取或设置 WebClient 发出请求的基 URI
Credentials
获取或设置发送到主机并用于对请求进行身份验证的网络凭据
获取和设置用于上载和下载字符串的 Encoding
获取或设置与请求关联的标头名称/值对集合
获取一个值,该值指示某一 Web 请求是否处于进行中
ResponseHeaders
获取与响应关联的标头名称/值对集合
UseDefaultCredentials
获取或设置一个 Boolean 值,该值控制默认凭据是否随请求一起发送
CancelAsync
取消一个挂起的异步操作
DownloadStringAsync
以字符串形式下载位于指定 Uri 的资源
GetWebRequest
为指定资源返回一个 WebRequest 对象
GetWebResponse
使用指定的 IAsyncResult 返回指定 WebRequest 的 WebResponse
OpenReadAsync
打开流向指定资源的可读流
OpenWriteAsync
打开一个流以将数据写入指定的资源。
UploadStringAsync
将指定的字符串上载到指定的资源
DownloadProgressChanged
在异步下载操作成功传输部分或全部数据后发生
DownloadStringCompleted
在异步资源下载操作完成时发生
OpenReadCompleted
在异步资源读取操作完成时发生
OpenWriteCompleted
在打开流以将数据写入资源的异步操作完成时发生
UploadProgressChanged
在异步上载操作成功传输部分或全部数据后发生
UploadStringCompleted
在异步字符串上载操作完成时发生
WriteStreamClosed
在异步写入流操作完成时发生
创建实例WebClient webClient = new WebClient();
设置回调webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
下载数据webClient.DownloadStringAsync(new System.Uri("/windows_phone/b/windowsphone/rss.aspx"));
此类为Windows Phone使用HTTP协议获取网络数据的另外一个选择,提供 WebRequest 类的 HTTP 特定的实现。
获取或设置 Accept HTTP 标头的值
AllowAutoRedirect
获取或设置一个值,该值指示请求是否应跟随重定向响应
AllowReadStreamBuffering
如果已在子类中重写,则获取或设置一个值,该值指示是否对从 Internet 资源读取的数据进行缓冲处理
AllowWriteStreamBuffering
获取或设置一个值,该值指示是否对发送到 Internet 资源的数据进行缓冲处理
ContentLength
为设置客户端发送的内容长度(以字节计)而获取
ContentType
获取或设置 Content-type HTTP 标头的值
CookieContainer
指定与 HTTP 请求相关联的 CookieCollection 对象的集合
CreatorInstance
当在子类中重写时,获取从 IWebRequestCreate 类派生的工厂对象,该类用于创建为生成对指定
URI 的请求而实例化的 WebRequest
Credentials
获取或设置请求的身份验证信息
HaveResponse
获取一个值,该值指示是否已收到来自 Internet 资源的响应
指定一个组成 HTTP 标头的名称/值对集合
获取或设置请求的方法
RequestUri
获取请求的原始统一资源标识符
SupportsCookieContainer
获取一个值,该值指示 CookieContainer 属性是否由 HttpWebRequest 实例支持
UseDefaultCredentials
当在子代类中重写时,获取或设置一个 Boolean 值,该值控制默认凭据是否随请求一起发送。
获取或设置 User-agent HTTP 标头的值
取消对 Internet 资源的请求
BeginGetRequestStream
开始对用来写入数据的 Stream 对象的异步请求
BeginGetResponse
开始对 Internet 资源的异步请求
EndGetRequestStream
结束对用于写入数据的 Stream 对象的异步请求
EndGetResponse
结束对 Internet 资源的异步请求
GetCurrentNetworkInterface
获取有关与 Web 请求相对应的网络接口的所有可用信息
SetNetworkPreference
设置 Web 请求的首选项,以使用蜂窝或非蜂窝技术
SetNetworkRequirement
设置 Web 请求的要求,以使用蜂窝或非蜂窝技术
使用WebRequest的Create方法创建实例。var forecastRequest =WebRequest.Create(Uri)
2.设置请求类型
当请求类型为GET时 forecastRequest.Method =
当请求类型为POST时 forecastRequest.Method =
添加RequestHeader
可以使用HttpWebRequest的Headers设置请求的消息头,如:forecastRequest.Headers["Encoding-Type"] = "gzip";
添加RequestEntity
若请求为POST时,需要向请求中添加消息体。使用BeginGetRequestStream()方法可以以流的方式添加消息体。
发送请求并获取数据
使用BeginGetResponse()方法可以获得请求的响应消息。如:forecastRequest.BeginGetResponse(new AsyncCallback(HandleForecastResponse),forecastState);
更多内容请参考:WebClient 和&HttpWebRequest&
HttpClient
类用于通过
HTTP 发送和接收基本要求。它提供了一个用于从 URI 所标识的资源发送 HTTP 请求和接收 HTTP 响应的基类。该类可用来向 Web 服务发送 GET、PUT、POST、DELETE 以及其他请求。上述每种请求都作为异步操作进行发送。
HttpResponseMessage
类用于声明从
HTTP 请求接收到的 HTTP 响应消息。
HttpContent
类是用于声明
HTTP 实体正文和内容标题的基类。 在这种情况下,HttpContent 用于声明 HTTP 响应。
HttpClient类属性
BaseAddress
获取或设置发送请求时使用的 Internet 资源的统一资源标识符 (URI) 的基地址
DefaultRequestHeaders
获取与每个请求一起发送的标题
MaxResponseContentBufferSize
获取或设置读取响应内容时要缓冲的最大字节数
获取或设置请求超时前等待的毫秒数
HttpClient主要方法
CancelPendingRequests
取消该实例所有挂起的请求
DeleteAsync
以异步操作发送 DELETE 请求
以异步操作发送 GET 请求
GetByteArrayAsync
发送 GET 请求并在异步操作中以字节数组的形式返回响应正文
GetStreamAsync
发送 GET 请求并在异步操作中以流的形式返回响应正文
GetStringAsync
发送 GET 请求并在异步操作中以字符串的形式返回响应正文
以异步操作发送 POST 请求
以异步操作发送 PUT 请求
以异步操作发送 HTTP 请求
创建HttpClient实例,如:
HttpClient client = new HttpClient();
设置Web 服务的响应接受的数据量,如:httpClient.MaxResponseContentBufferSize = 256000;
设置请求消息头,如: httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 ( MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
设置超时时间,如:httpClient.Timeout = new TimeSpan(10000);
HttpRequestMessage可以设置请求的类型,如POST、GET等,请求的地址以及请求的消息头消息体。
HttpClient类发送POST请求可以使用HttpClient.SendAsync(HttpRequestMessage)方法。如:Stream stream = GenerateSampleStream(1000);
StreamContent streamContent = new StreamContent(stream);
string resourceAddress = AddressField.Text.Trim();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, resourceAddress);
request.Content = streamC
request.Headers.TransferEncodingChunked =
HttpResponseMessage response = await httpClient.SendAsync(request);
HttpResponseMessage中有请求返回的数据,可以通过ReadAsStringAsync()以string方式异步读取消息体,也可以使用ReadAsStreamAsync()以流的方式异步读取消息体。
如:HttpResponseMessage response = await httpClient.SendAsync(request);
String responseBodyAsText = await response.Content.ReadAsStringAsync();
Stream responseStream = await response.Content.ReadAsStreamAsync()
更多内容请参考:快速入门:使用 HttpClient 进行连接
以下以DefaultHttpClient介绍Andriod中通过http协议发送和接受网络数据的方法
下面代码展示了Android使用DefaultHttpClient发送GET请求:String httpUrl = "http://192.168.0.132:8080/Android/httpreq.jsp?par=request-get";
HttpGet request = new HttpGet(httpUrl);
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
String str = EntityUtils.toString(response.getEntity());
tv_rp.setText(str);
tv_rp.setText("请求错误");
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
下面代码展示了使用DefaultHttpClient发送POST请求:String httpUrl = "http://192.168.0.132:8080/Android/httpreq.jsp";
HttpPost request = new HttpPost(httpUrl);
List params = new ArrayList();
params.add(new BasicNameValuePair("par","request-post"));
HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
request.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(request);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
String str = EntityUtils.toString(response.getEntity());
tv_rp.setText(str);
tv_rp.setText("请求错误");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
以下以NSMutableURLRequest(NSURLRequest的子类)为例,介绍IOS中通过http发送和接受网络数据的方法。
NSURL *url = [NSURL URLWithString:URLString];
NSMutableURLRequest
*request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:url];
[request setHTTPMethod:@"GET"];
NSURLConnection *conn = [[[NSURLConnection alloc] initWithRequest:request delegate:nil] autorelease];
[conn start];
NSURL *url = [NSURL URLWithString:URLString];
NSMutableURLRequest
*request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:url];
[request setHTTPMethod:@"GET"];
NSURLConnection *conn = [[[NSURLConnection alloc] initWithRequest:request delegate:nil] autorelease];
[conn start];
NSURL *url = [NSURL URLWithString:URLString];
NSData* data =
NSMutableURLRequest
*request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:data];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [data length]] forHTTPHeaderField:@"Content-Length"];
NSURLConnection *conn = [[[NSURLConnection alloc] initWithRequest:request delegate:nil] autorelease];
[conn start];
在Http请求中,请求和响应的实体通常为XML或Json格式。
System.Xml.Serialization命名空间下提供XmlSerializer类,将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。如下代码展示了如何使用XmlSerializer类
var type = obj.GetType();
var xmlSerializer = new XmlSerializer(type);
var sb = new StringBuilder();
xmlSerializer.Serialize(XmlWriter.Create(sb), obj);
var xmlSerializer = new XmlSerializer(typeof(T));
var stringReader = new StringReader(xml);
obj = (T)xmlSerializer.Deserialize(stringReader);
在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器
SDK提供了NSXMLParser和libxml2两个类库
NSXMLParser,NSXMLParser Class Reference ,这是一个SAX方式解析XML的类库,默认包含在iOS
SDK中,使用也比较简单。
libxml2,http://xmlsoft.org/,是一套默认包含在iOS SDK中的开源类库,它是基于C语言的API,所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析,libxml2的SAX解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的XML文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率
System.Runtime.Serialization.Json提供DataContractJsonSerializer类对Json进行序列化和反序列化为对象。如下代码展示如何使用DataContractJsonSerializer
对象转化为JSON字符串使用WriteObject方法:var config = new Config(){
encoding = "UTF-8",
plugins = new string[]{"python", "C++", "C#"},
indent = new Indent(){ length = 4, use_space = false}
var serializer = new DataContractJsonSerializer(typeof(Config));
var stream = new MemoryStream();
serializer.WriteObject(stream, config);
byte[] dataBytes = new byte[stream.Length];
stream.Position = 0;
stream.Read(dataBytes, 0, (int)stream.Length);
string dataString = Encoding.UTF8.GetString(dataBytes);
JSON字符串转对象使用ReadObject方法:var mStream = new MemoryStream(Encoding.Default.GetBytes(dataString));
Config readConfig = (Config)serializer.ReadObject(mStream);
android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值
JSONStringer构建json文本
JSONArray、它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔
JSONTokener按照RFC4627规范将json文本解析为相应的对象。
JSONException
处理json解析异常
在ios5中,苹果引入了NSJSONSerialization用来序列化和反序列化json数据,
通过NSJSONSerialization这个类的JSONObjectWithData:options:error:方法来实现反序列化。&
通过NSJSONSerialization这个类的dataWithJSONObject:options:error:方法来实现序列化
其它微软站点比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
如何利用HTML5与MongoDB创建位置感知Web程序
关键字:Web
  在日常生活中,我们都离不开位置识别类应用程序。、等应用程序帮助我们和我们的家人朋友分享当前位置(或者正在参观的景点)。而像 Local这样的应用则帮助我们找到当前位置有哪些自己需要的服务设施或业务场所。如此,如果我们需要找到一家离自己最近的咖啡厅,完全可以通过Google Local快速获取建议并立刻动身前往。这不仅大大方便了日常生活,还能够帮助将自己的产品推销给更理想的受众群体。无论是对消费者还是对企业,这都堪称完双赢局面。
  要创建这样一款应用程序,大家首先需要获取用户的地理位置信息。根据维基百科的解释,“地理信息是指某个对象所处的现实地理位置”。就目前来看,Web应用程序中还没有出现标准化的用户地理位置获取方式。虽然Google Gears这样的开源库能够从用户处获取位置信息,但这套库已经停止发展、只能运行在旧版本当中而且不支持W3C地理位置API。W3C GeoLocation API提供了一套规范,能够通过标准化脚本访问与托管设备相关的地理信息。Geo Location并不提供对的官方支持,但这仍然无法阻止人们的热情,而且我们经常听说开发人员将GeoLocation API与HTML 5相对接。该API以用户所收集的地理信息为基础建立抽象层,从而保证所有浏览器都支持地理定位API。大家可以访问/#feat=geolocation获取下列图表。
  应用程序用例――找工作应用
  在本文中,我们将创建一款能够感知地理位置的找工作应用。应用程序将根据用户的特定技能(例如Java、Scala以及MongoDB等)寻找最近的求职地点。应用将利用W3C GeoLocation API实现用户定位。接下来,应用程序将用户位置绘制在地图当中。大家可以访问http://localjobshtml5-/获取这款应用。用户图标对应用户当前地理位置,公文包图标则对应目标求职地点。
  如果大家点击任何公文包图标,地图会如下图所示自动放大。而当我们关闭信息窗口,画面会再次缩小。另外,大家可以在标记中查看求职场所与当前位置之间的距离、对应职务以及其它相关资料。用户位置与工作位置之间的距离由MongDB的地理空间功能所支持,我们会在后面的文章中进一步讨论这个话题。
  应用程序技术堆栈
  这款应用的创建需要使用以下技术堆栈:
  Java EE 6 : 我们将使用数项Java EE 6规范――JAX-RS以及CDI。JAX-RS属于针对Restful Web服务的Java API,其作用在于根据REST架构模式为网络服务创建提供Java API。CDI则是Context and Dependency Injection(背景与关联性注入)的缩写。CDI允许开发者将Java EE组件与生命周期背景进行绑定、注入,而后通过事件触发与观察机制以松散的耦合方式实现交互。
  MongoDB : MongoDB是一套面向文档的NoSQL数据机制。我们将把工作数据保存在MongoDB当中并在应用程序中使用其地理空间功能。
  HTML 5 : 我们将利用HTML 5创建应用程序客户端,并利用W3C GeoLocation API获取用户的当前位置。
  谷歌地图 : 应用程序将利用谷歌地图来处理用户位置以及求职信息。
  OpenShift : 应用程序将被部署到OpenShift公共PaaS当中。
  应用程序源代码
  这款应用程序的源代码被发布在GitHub当中,地址为:/shekhargulati/localjobshtml5
  前续条件
  在我们着手创建应用程序之前,首先需要进行以下几项设置任务:
  1. 注册一个OpenShift账户。账户注册完全免费,而且红帽将为每位用户免费提供三套Gear用于运行应用程序。截至本文截稿时,该账户可以获得1.5GB内存容量与3GB存储空间。
  2. 在设备上安装rhc客户工具。rhc是一套ruby gem包,因此大家需要在设备上安装ruby 1.8.7或者更高版本。要安装rhc,大家需输入:
  sudo gem install rhc
  如果当前已经安装过ruby,请确保其处于最新版本。要更新rhc工具,请执行如下所示命令:
  sudo gem update rhc
  如需其它相关rhc命令行工具设置说明,请点击下列网址查看相关资料:/community/developers/rhc-client-tools-install
  1 利用rhc setup命令设置OpenShift账户。这条命令将帮助大家创建一个命名空间并将自己的密钥上传至OpenShift。
  开始创建应用程序
  现在我们已经完成了全部前续设置工作,现在开始创建应用程序。我们将从创建OpenShift应用程序开始。在与PaaS协作时,大家首先需要明确一点:PaaS是用来创建应用程序的。因此,现在我们要摆脱过去以虚拟机或者服务器为中心的理念,将全部集中在应用程序身上。
  创建JBossEAP MongoDB OpenShift应用程序
  要创建名为“localjobs”且使用JBossEAP与MongDB的应用程序,我们首先要执行以下命令:
  rhc app create localjobs jbosseap mongodb-2.2
  这将为我们创建一套应用程序容器,也就是所谓gear,并为其配置全部必要的SELinux政策以及cgroup配置。OpenShift还将为我们设置一个私有git库,并将该库克隆到本地系统当中。最后,OpenShift会将DNS发送至外部环境。大家可以通过http://localjobs-domain-访问该应用。将其中的替换为您自己的独特域名即可。
  上述命令将创建一套标准化Maven项目模板。有趣的是,在pom.xml文件中存在一段名为openshift的配置信息,如下所示。因此,当大家将自己的源代码推送至OpenShift时,该Maven配置文件将付诸执行。该配置文件不会引发任何影响――而只是创建一个名为ROOT的war文件,从而保证我们的应用程序可用于root背景之下。
   openshift localjobs maven-war-plugin 2.1.1 deployments ROOT
  接下来,我们将把index.html与snoop.jsp两个文件从自己的git库中移除――它们的历史使命已经完成。如果大家不太熟悉git的运作方式,请点击此处阅读由Lars Vogel撰写的上手指南。
  git rm -f src/main/webapp/index.html src/main/webapp/snoop.jsp
  git commit -am "deleted template files"
  添加MongoDB Java驱动程序关联性
  由OpenShift创建的pom.xml文件已经拥有全部与Java EE 6相关的关联性。为了使用MongoDB,我们还需要添加MongoDB Java驱动关联性。我使用的是MongoDB Java驱动的最新版本。将下列关联性内容添加到pom.xml文件当中。大家可以点击此处在github上查看完整的pom.xml文件。
   org.mongodb mongo-java-driver 2.10.1
  启用CDI
  CDI代表背景与关联性注入。之所以在应用程序中使用CDI,是因为我们需要利用关联性注入来代替手动创建对象。CDI容器将管理bean生命周期,这样我们作为开发者只需要编写业务逻辑即可。为了让JBossEAP应用程序服务器了解到我们正在使用CDI,我们需要在WEB-INF文件夹下创建一个beans.xml文件。该文件可以保持空白,但它的存在会使容器了解到需要加载CDI框架。Beans.xml文件的内容如下所示:
  编写MongDB连接类
  接下来,我们将创建一个应用程序作用域bean,用于管理MongoDB数据库连接。该连接类同时起效于本地系统与OpenShift端。大家可以点击此处在github中查看该类的完整内容。
  @ApplicationScoped public class DBConnection { private DB mongoDB; @PostConstruct public void afterCreate() { System.out.println("just see if we can say anything"); String host = System.getenv("OPENSHIFT_MONGODB_DB_HOST"); if (host == null || "".equals(host)) { // Create Local MongoDB Connection } else { String mongoport = System.getenv("OPENSHIFT_MONGODB_DB_PORT"); String user = System.getenv("OPENSHIFT_MONGODB_DB_USERNAME"); String password = System.getenv("OPENSHIFT_MONGODB_DB_PASSWORD"); String db = System.getenv("OPENSHIFT_APP_NAME"); int port = Integer.decode(mongoport); Mongo mongo = try { mongo = new Mongo(host, port); } catch (UnknownHostException e) { System.out.println("Couldn't connect to Mongo: " + e.getMessage() + " :: " + e.getClass()); } mongoDB = mongo.getDB(db); if (mongoDB.authenticate(user, password.toCharArray()) == false) { System.out.println("Failed to authenticate DB "); } } } @Produces public DB getDB() { return mongoDB; } }
  在应用程序运行过程中,@ApplicationScoped bean将始终存在,并在应用程序关闭的同时被删除。这正是我们希望通过MongoDB驱动所达到的连接池对象保留效果。
  编写RESTful后端
  现在我们开始利用JAX-RS为自己的应用程序编写RESTful后端。我们将通过创建一个用于扩展javax.ws.rs.ApplicationPath的类激活JAX-RS。大家需要指定基础url,并将其作为网络服务的访问地址。要实现这一目的,我们需要利用ApplicationPath注释为这个类添加注释。如下列代码所示,我利用“/api”作为基础URL:
  import javax.ws.rs.ApplicationP import javax.ws.rs.core.A @ApplicationPath("/api") public class JaxRsActivator extends Application { /* class body intentionally left blank */ }
  在成功激活了JAX-RS之后,我们现在可以编写自己的REST服务。大家可以访问http://localjobs-domain-name/api/jobs/{skills}?longitude={longitude}&latitude={latitude}以查看REST端点。该REST端点将搜寻周边经纬度范围内全部与求职者技能相符的工作岗位。
  @Path("/jobs") public class JobsRestService { @Inject private DB @GET @Path("/{skills}") @Produces(MediaType.APPLICATION_JSON) public List allJobsNearToLocationWithSkill( @PathParam("skills") String skills, @QueryParam("longitude") double longitude, @QueryParam("latitude") double latitude) { String[] skillsArr = skills.split(","); BasicDBObject cmd = new BasicDBObject(); cmd.put("geoNear", "jobs"); double lnglat[] = { longitude, latitude }; cmd.put("near", lnglat); cmd.put("num", 10); BasicDBObject skillsQuery = new BasicDBObject(); skillsQuery.put("skills", new BasicDBObject("$in", Arrays.asList(skillsArr))); cmd.put("query", skillsQuery); cmd.put("distanceMultiplier", 111); CommandResult commandResult = db.command(cmd); BasicDBList results = (BasicDBList)commandResult.get("results"); List jobs = new ArrayList(); for (Object obj : results) { Job job = new Job((BasicDBObject)obj); jobs.add(job); } } }
  上面所示的代码会创建一条MongoDB附近位置查询,其结果文件数量被限制为10个。MongoDB返回的结果将作为数据中的数值。由于我们利用经度与纬度进行定位,返回的数据也以经纬度为基础。不过MongoDB还提供一套距离换数选项,允许我们将经纬度结果换算成更易理解的公里或者英里。在上面的代码中,我将经纬度结果转换为111公里。最后,我们将数据转换为一个名为Job的域对象并将其返回。@Produces注释将负责将数据转换至JSON当中。
  将数据载入至MongoDB当中
  执行下列命令将数据载入至运行在OpenShift gear中的MongoDB。
  在本地设备上,运行rhc app show。这条命令将返回应用程序的详细信息,如下所示:
  $ rhc app show -a localjobs localjobs @ http://localjobs-/ (uuid: 73ca386f000083) ----------------------------------------------------------------------------------- Created: 12:45 PM Gears: 1 (defaults to small) Git URL: ssh://73ca386f000083@localjobs-/~/git/localjobs.git/ SSH: 73ca386f000083@localjobs- jbosseap-6.0 (JBoss Enterprise Application Platform 6.0) -------------------------------------------------------- Gears: Located with mongodb-2.2 mongodb-2.2 (MongoDB NoSQL Database 2.2) ---------------------------------------- Gears: Located with jbosseap-6.0 Connection URL: mongodb://$OPENSHIFT_MONGODB_DB_HOST:$OPENSHIFT_MONGODB_DB_PORT/ Database Name: localjobs Password: qySukKdKrZQT Username: admin
  记录下SSH URL并利用scp命令将jobs-data.json文件复制到我们的应用程序gear当中。大家可以点击此处下载jobs-data.json文件。
  $ scp jobs-data.json :app-root/data
  接着将SSH插入到应用当中,使用如下所示的rhc app ssh命令:
  $ rhc app ssh -a localjobs
  将ssh导入至应用程序gear中后,将目录变更为app-root/data,也就是我们复制jobs-data.json文件的目录。
  $ cd app-root/data
  下面运行mongoimport命令将数据导入至MongoDB数据库当中。
  $ mongoimport -d localjobs -c jobs --file jobs data.json -u $OPENSHIFT_MONGODB_DB_USERNAME -p $OPENSHIFT_MONGODB_DB_PASSWORD -h $OPENSHIFT_MONGODB_DB_HOST -port $OPENSHIFT_MONGODB_DB_PORT
  上面显示的代码将把159个job对象导入至MongoDB当中。
  最后,我们需要在工作集合中创建地理位置索引。MongoDB只支持二维地理位置索引。大家只能为每个集合匹配一套地理位置索引。在默认情况下,二维地理位置索引假设经度与纬度数值在-180(含180)到180(不含180)之间(即[-180,180])。要创建地理信息索引,需要执行下列命令:
  $ mongo $ use localjobs $ db.jobs.ensureIndex({"location" : "2d"})
  测试RESTful服务
  下面,我们将提供源代码并向OpenShift推送变更内容,即创建项目、创建新的war文件并将其部署到运行在OpenShift上的JBossEAP当中。
  $ git add . $ git commit -am "RESful backend done" $ git push
  在代码创建与war文件部署工作完成后,我们就可以利用curl命令对REST服务进行测试了。
  curl -i -H "Accept: application/json" http://localjobs-/api/jobs/java,scala?longitude=-121.894955&latitude=37.339386 HTTP/1.1 200 OK Date: Fri, 17 May :11 GMT Server: Apache-Coyote/1.1 Content-Type: application/json Vary: Accept-Encoding Transfer-Encoding: chunked [{"companyName":"CyberCoders","jobTitle":"Embedded Java Applications Engineer","distance":82882,"skills":["java"],"formattedAddress":"1400 North Shoreline Boulevard, Mountain View, CA, United States","longitude":-122.078488,"latitude":37.414198},{"companyName":"CyberCoders","jobTitle":"Embedded Java Applications Engineer","distance":82882,"skills":["java"],"formattedAddress":"1400 North Shoreline Boulevard, Mountain View, CA, United States","longitude":-122.078488,"latitude":37.414198} ..... ]
  美化应用程序
  现在我们已经证实了应用程序的REST服务工作正常,接下来要做的是构建应用的用户界面。在本文中,我们只需创建一套非常简单的应用用户界面,即提供一套表单,用户可以借助它输入个人技能,并通过div承载谷歌地图渲染完成的求职场所与用户位置。如下所示在src/main/webapp文件夹中创建一个index.html文件:
  上面显示的index.html是一个HTML 5文件,而且使用HTML 5的文档类型。我们的应用使用 Bootstrap,这是一款免费工具集合,用于创建网站以及web应用程序。它包含了以HTML以及为基础的设计模板,提供全套排版、表格、按钮、图表、导航、其它界面组件以及备选JavaScript扩展。大家可以点击此处从本项目的github库中获取全部相关css.js文件。
  检查GeoLocation支持
  由于我们的应用程序以用户位置为基础,因此在进一步调整应用程序之前需要首先检查GeoLocation API。为了检查用户浏览器对GeoLocation API的支持效果,需要将如下所示记录准备函数添加进来。如果用户浏览器支持GeoLocation,那么导航对象中将具有geolocation对象。大家还可以利用Modernizr等开源库检测HTML 5功能。如果用户浏览器不支持geolocation,大家需要禁用表单提交按钮。
  在提交表单中查找工作
  现在我们已经确认用户浏览器能够支持GeoLocation API,接下来要做的就是根据用户的个人技能为其查找理想工作。此项目利用Backbone.js为我们的客户端代码添加结构。如果大家对backbone.js不太熟悉,可以点击此处查看我之前发表的博文《利用Backbone.js、JaxRS、MongoDB以及OpenShift创建单页面Web应用程序》,那里提供了与利用backbone.js创建应用有关的详细说明。请将app.js文件考虑到src/main/webapp目录下的js文件夹当中。下面展示的是经过精简的app.js文件内容,这是为了适当缩减本文的篇幅。
  // app.js (function($){ var LocalJobs = {}; window.LocalJobs = LocalJ var template = function(name) { pile($('#'+name+'-template').html()); }; LocalJobs.HomeView = Backbone.View.extend({ tagName : "form", el : $("#main"), events : { "submit" : "findJobs" }, render : function(){ console.log("rendering home page.."); $("#map-canvas").empty(); }, findJobs : function(event){ event.preventDefault(); $("#map-canvas").empty(); $("#jobSearchForm").mask("Finding Jobs ..."); var skills = this.$('input[name=skills]').val().split(','); console.log("skills : "+skills); var self = var mapOptions = { zoom: 3, center: new.LatLng(-34.397, 150.644), mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU }, mapTypeId: google.maps.MapTypeId.ROADMAP, zoomControlOptions: { style: google.maps.ZoomControlStyle.SMALL } }; var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); navigator.geolocation.getCurrentPosition(function(position){ var longitude = position.coords. var latitude = position.coords. console.log('longitude .. '+longitude); console.log('latitude .. '+latitude); $("#jobSearchForm").unmask(); self.plotUserLocation(new google.maps.LatLng(latitude, longitude),map); $.get("api/jobs/"+skills+"/?longitude="+longitude+"&latitude="+latitude , function (results){ $("#jobSearchForm").unmask(); self.renderResults(results,self,map); }); }, function(e){ $("#jobSearchForm").unmask(); // handle error }, { timeout: 45000 } ); }, plotUserLocation : function(latLng , map){ }, renderResults : function(results,self,map){ var infoWindow = new Window(); _.each(results,function(result){ self.renderJob(result,map , infoWindow); }); }, renderJob : function(result , map , infoWindow){ } }); LocalJobs.Router = Backbone.Router.extend({ el : $("#main"), routes : { "" : "showHomePage" }, showHomePage : function(){ console.log('in home page...'); var homeView = new LocalJobs.HomeView(); this.el.append(homeView.render().el); } }); var app = new LocalJobs.Router(); Backbone.history.start(); })(jQuery);
  下面我们一起来解读代码的具体。
  1. 上面展示的代码旨在创建一个backbone路由实例,并将其作为root DOM的主div。下面我们点击基础url,路由机制会调用映射HomeView的showHomePage函数。渲染函数中的HomeView用于通过id map-canvas清空div。
  2. 在HomeView当中,我们拥有一套针对表单提交的事件侦听器。因此,当用户输入个人技能并按下“提交”按钮后,findJobs函数将被调用。
  3. findJobs函数是一切运行的基础。
  3.1 我们首先利用技能名称获取输入值,然后利用逗号将内容分割,这样就构成了一套技能数组。
  3.2 我们接着创建一个谷歌地图对象并为其设置一些默认值。
  3.3 下面我们调用navigator.geolocation对象上的getCurrentPosition方法。此方法只有一项必要参数success_callback与两项可选参数error_callback,外加可选对象PositionOptions。
  3.4 如果getCurrentPosition被调用成功,则继续调用success_callback。这条回调函数拥有一项参数――position。这个position对象负责保留用户的经伟度结果,并在地图上绘制用户的当前位置。
  3.5 在用户位置绘制完成之后,则通过jQuery进行获取调用。
  3.6 最后所有结果都将经过迭代并显示在地图之上。
  推送代码
  现在大家可以将代码推送至OpenShift处并查看应用程序在云中的运行效果。
  git add . git commit -am "localjobs app with UI" git push
  按照我所罗列的提示内容,应用程序将运行在https://localjobs-domain-/位置。大家可以将具体域名替换为自己的命名空间。
[ 责任编辑:jj ]
如果你是一个企业级SaaS的创…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte}

我要回帖

更多关于 回调地狱 服务器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信