Groovy HTTPBuilder POST: отсутствующие методы

Я закладываю основу для очень простого приложения Grails, которое интегрируется с Last.fm. Я застрял на аутентификации пользователя, где я получаю сеансовый ключ. Из документации это звучит как очень простой HTTP POST в формате, который я ниже в коде. Я пробовал все варианты сообщения и запроса HTTPBuilder (POST), которые я нашел, но все ошибки выходили примерно так:

| Server running. Browse to http://localhost:8080/GroovyLastFM
| Error 2013-05-14 19:57:10,042 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver  - MissingPropertyException occurred when processing request: [GET] /GroovyLastFM/RecentSongs/tokenChecker - parameters:
token: 452b5619f98e3b66cec11b61940af500
No such property: Method for class: GroovyLastFM.User. Stacktrace follows:
Message: No such property: Method for class: GroovyLastFM.User
Line | Method
->>   28 | getSession in GroovyLastFM.User

Я не знаю, что еще мне нужно импортировать, но явно чего-то не хватает. Пригодятся ли подключаемые модули Grails? Если да, то что мне нужно включить на уровне приложения, чтобы HTTPBuilder заработал? Я новичок в Grails и не знаю, что заслуживает добавления к зависимостям или как это сделать. Кроме того, я использую Grails 2.1.1 и не использую IDE. Спасибо!

package GroovyLastFM

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.0-RC2' )
import java.security.MessageDigest
import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*

class User {
String token
String api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
String secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

User (String token) {
    this.token = token
    getSession()
}

def getSession() {
    String signature = md5("api_key" + api_key + "methodauth.getSessiontoken" + token + secret)
    def postbody = [token:token, api_key:api_key, method:'auth.getSession', api_sig:signature]
    def http = new HTTPBuilder("http://wx.audioscrobbler.com/2.0/")
    http.request(Method.POST) {req->
        headers.accept = "application/xml"
        requestContentType = ContentType.URLENC
        body = postbody
        response.success { resp,xml->
            // read xml response
        }
    }   
}

Я также попробовал базовую запись curl, чтобы убедиться, что мои параметры верны, и он вернул сеансовый ключ, как я и ожидал:

curl -X POST -d "token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&api_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&method=auth.getSession&api_sig=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" http://ws.audioscrobbler.com/2.0/

Ссылки:


person turnerd18    schedule 15.05.2013    source источник


Ответы (1)


Вы импортируете groovyx.net.http.Method.* и используете Method.POST, поэтому получаете No such property: Method.

Замените его на:

http.request(POST) { req ->  ... }

... так и должно быть.

Кроме того, вы также можете изменить импорт на:

import static groovyx.net.http.Method

и продолжайте использовать Method.POST.

person Elias Dorneles    schedule 15.05.2013
comment
Конечно же! Знал, что должен быть рядом :) Спасибо. - person turnerd18; 15.05.2013
comment
так что же означает метод.*? - person Fadeoc Khaos; 22.04.2019