【问题标题】:Grails Restful Client app, how best to structure OATH and views?Grails Restful Client 应用程序,如何最好地构建 OATH 和视图?
【发布时间】:2014-06-23 14:20:27
【问题描述】:

是的,您以前听说过,但我还是要发布它.. 我是 Groovy 和 Grails 的新手。我正在尝试使用最佳实践来创建一个 Grails Restful 客户端应用程序(最终是一个 liferay portlet),它将能够提取 JSON 并将其呈现在漂亮的视图中。

我发现了这个很棒的脚本,经过一些修改,它至少可以从我们的第三方 CRM 供应商那里提取 JSON 格式的对象,太棒了!所以它是有效的,但是,如果我没记错的话,将诸如 OATH 部件之类的东西模块化到 Grails 服务中以便它可以在多个控制器中使用不是最好的吗?我想将以下(正常运行的)groovy 脚本分解为 Grails 应用程序结构的正确部分,这样我就有了一个遵循最佳实践的可扩展应用程序。由于 portlet 插件的版本要求,我不得不继续使用 Grails 2.2.5。任何帮助将下面的代码切碎并进入正确的控制器、服务和视图将不胜感激,并帮助我(和其他人)理解这是如何工作的。

这是我认为最终可能会出现在服务中的东西

package school.infotech.edu

import groovyx.net.http.HTTPBuilder
import groovyx.net.http.HttpResponseException
import static groovyx.net.http.ContentType.URLENC
import static groovyx.net.http.Method.POST
import static groovyx.net.http.Method.GET
import static groovyx.net.http.ContentType.JSON


@Grapes(
  @Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.6')
)

def sf_login_domain = 'https://crm.thirdpartyvendor.com/'
def instance_domain
def access_token = ''
def consumer_key = 'BIGLONGKEYTHATWORKS'
def consumer_secret = 'SOMENUMBERSTHATWORK'
def auth_username = 'OURACCESSACCOUNTTHATWORKS'
def auth_password = 'WORKINGPASSWORD'
def auth_security_token = 'SECURITYTOKEN'



//Request Access_token and instance domain for work 
def http = new HTTPBuilder(sf_login_domain)
 def postBody = [
         grant_type: 'password',
         client_id: consumer_key,
         client_secret: consumer_secret,
         username: auth_username,
         password: auth_password+auth_security_token
         ]
try{ 

    http.post( path : 'services/oauth2/token',
          body : postBody,
          requestContentType: URLENC) { resp, json ->
                access_token = json.access_token
                instance_domain = json.instance_url +"/"
               }

}catch(HttpResponseException e){
    println "Error code: ${e.statusCode}"
    println "Post form: $postBody"
}


println "Access Token $access_token"
println "Instance domain $instance_domain \n"

所以我认为这些东西可能在控制器或视图中,但我如何调用服务的东西?

println "List API Resources \n"
http = new HTTPBuilder(instance_domain)
http.request(GET,JSON) { req ->
  uri.path = 'services/data/v28.0/' 
  headers['Authorization'] = "Bearer $access_token"

   response.success = { resp, json  ->
     assert resp.status == 200
     json.each{ key,value ->
        println "$key : $value"
    }
  }

  response.failure = { resp, json ->
    println resp.status
    println json.errorCode
    println json.message
  }
}

println "List sobject Resources \n"
http.request(GET,JSON) { sobjectreq ->
  uri.path = 'services/data/v28.0/sobjects/' 
  headers['Authorization'] = "Bearer $access_token"

  response.success = { resp, json  ->
    assert resp.status == 200


    json.each{ key,value ->
        println "$key : $value \n"
    }
      json.objectDescribe.each{ key,value ->
        println "$key : $value"
    }

  }


}

println "List chatter \n"
http.request(GET,JSON) { req ->
  uri.path = 'services/data/v28.0/chatter' 
  headers['Authorization'] = "Bearer $access_token"

  response.success = { resp, json  ->
    assert resp.status == 200
    json.each{ key,value ->
        println "$key : $value"
        }
  }

  response.failure = { resp, json ->
    println resp.status
    println json.errorCode
    println json.message
  }
}

未解决的问题是

  1. 哪个块应该去哪里?
  2. 如何从服务引用控制器/
  3. 如何在视图中显示生成的 JSON(作为地图?)?

提前感谢您的帮助。

【问题讨论】:

    标签: json rest grails groovy oauth


    【解决方案1】:

    进行 REST 调用的部分可以进入注入控制器的服务。注意我不推荐 HTTPBuilder,因为它是一堆依赖,你最好使用 http://grails.org/plugin/rest-client-builder 或 https://github.com/jwagenleitner/groovy-wslite

    【讨论】:

    • 感谢指点!我喜欢 groovy-wslite。但不支持oauth。维护者建议为此使用 httpbuilder :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2013-10-21
    相关资源
    最近更新 更多