groovy / grails – 无法使HTTPBuilder使用URL(由Paypal提供)
请注意:使用下面的代码/信息,这个问题可以在2-3分钟内重现.
背景:首先我还没有找到一个插件来帮助支持Paypal高级界面(他们在“标准”和“专业版”之间的中级解决方案),但是如果我不需要滚动我自己的HTTPBuilder和其他界面代码我绝对是为了那个. 现在,我能够缩小HTTPBuilder问题,使用正确的URL从DW提示符开始使用curl命令;我无法让它与groovy的HTTPBuilder一起工作. 那么,一个人可以轻松尝试的是: c:groovyex>curl https://pilot-payflowpro.paypal.com curl: (52) Empty reply from server 但还是回复.或者从Paypal获得SECURETOKEN的真实URL更像是: c:groovyex>curl https://pilot-payflowpro.paypal.com -kd "PARTNER=PayPal&VENDOR=ROAdvanced&USER=ROAdvanced&PWD=joespizza1&TRXTYPE=S&MODE=TEST&AMT=40&CREATESECURETOKEN=Y&SECURETOKENID=12528208de1413abc3d60c86233" RESULT=0&SECURETOKEN=15XTWEZtFlkeNqtWCBZHSTgcs&SECURETOKENID=12528208de1413abc3d60c86233&RESPMSG=Approved OR you'll get a result like the following,but either result is good,since Paypal is sending a response in both cases! RESULT=7&SECURETOKENID=12528208de1413abc3d60c86233&RESPMSG=Field format error: Secure Token Id already been used 好的,我的代码如下.即使(我认为)我正在使用延迟,请注意我的代码错误立即失败: Class: org.apache.http.NoHttpResponseException Message: The target server failed to respond 这发生在 http.request(GET,ContentType.ANY) { 请注意,即使设置HTTPBuilder的延迟,此故障也会立即发生.我会把整个代码/堆栈跟踪放在最后.另请注意,如果添加SSL安全性as described in this post,结果是相同的错误,即服务器无法响应. 所以代码是: package apps import grails.converters.* import org.codehaus.groovy.grails.web.json.*; // package containing JSONObject,JSONArray,... import groovyx.net.http.* import static groovyx.net.http.ContentType.* import static groovyx.net.http.Method.* import javax.net.ssl.X509TrustManager import javax.net.ssl.SSLContext import java.security.cert.X509Certificate import javax.net.ssl.TrustManager import java.security.SecureRandom import org.apache.http.conn.ssl.SSLSocketFactory import org.apache.http.conn.scheme.Scheme import org.apache.http.conn.scheme.SchemeRegistry import org.apache.http.conn.ssl.X509HostnameVerifier class PaypalController { def index() { def paypalUrl = "https://pilot-payflowpro.paypal.com?PARTNER=PayPal&VENDOR=ROAdvanced&USER=ROAdvanced&PWD=joespizza1&TRXTYPE=S&MODE=TEST&AMT=40&CREATESECURETOKEN=Y&SECURETOKENID=12528208de1413abc3d60c86cdr87" //def paypalUrl = "https://pilot-payflowpro.paypal.com" println "Making new http Builder with paypalURL ..." def http = new HTTPBuilder(paypalUrl) println "Now setting timeouts ..." http.getClient().getParams().setParameter("http.connection.timeout",new Integer(12000)) http.getClient().getParams().setParameter("http.socket.timeout",new Integer(30000)) //=== SSL UNSECURE CERTIFICATE === println "Don't know if needed,but since timeouts don't work to get a response,setting up SSL bypass" def sslContext = SSLContext.getInstance("SSL") sslContext.init(null,[new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() {null } public void checkClientTrusted(X509Certificate[] certs,String authType) { } public void checkServerTrusted(X509Certificate[] certs,String authType) { } }] as TrustManager[],new SecureRandom()) //SSLSocketFactory sf = new org.apache.http.conn.ssl.SSLSocketFactory(sslContext,org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) SSLSocketFactory sf = new org.apache.http.conn.ssl.SSLSocketFactory(sslContext) sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) def httpsScheme = new Scheme("https",sf,443) http.client.connectionManager.schemeRegistry.register(httpsScheme) println "Now doing the get" // perform a GET request,expecting JSON response data try { http.request(GET,ContentType.ANY) { println "Issued the get waiting for the response" // Sleeping doesn't help //Thread.sleep(2000) // println "Done sleeping,looking to process success" response.success = { resp,any -> println "in success code" println "My response handler got response: ${resp.statusLine}" println "Response length: ${resp.headers.'Content-Length'}" assert resp.status == 200 def result = any.results; render(view: "index",model: [message: "Request sent",result: result]); } println "past the success code" }//end of request } catch (groovyx.net.http.HttpResponseException ex) { println "Had response exception ...." ex.printStackTrace() return null } catch (java.net.ConnectException ex) { println "Had connection exception ...." ex.printStackTrace() return null } finally { http.shutdown() } }//end of method def fail() {} def success() {} } ——————-运行此代码我得到(没有任何延迟)——————– —– Making new http Builder with paypalURL ... Now setting timeouts ... Don't know if needed,setting up SSL bypass Now doing the get Issued the get waiting for the response past the success code | Error 2013-07-19 13:27:32,301 [http-bio-8080-exec-10] ERROR errors.GrailsExceptionResolver - NoHttpResponseException occurred when processing request: [GET] /apps/paypal/index The target server failed to respond. Stacktrace follows: Message: The target server failed to respond Line | Method ->> 101 | parseHead in org.apache.http.impl.conn.DefaultResponseParser - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 210 | parse in org.apache.http.impl.io.AbstractMessageParser | 271 | receiveResponseHeader in org.apache.http.impl.AbstractHttpClientConnection | 233 | receiveResponseHeader in org.apache.http.impl.conn.DefaultClientConnection | 209 | receiveResponseHeader in org.apache.http.impl.conn.AbstractClientConnAdapter | 292 | doReceiveResponse in org.apache.http.protocol.HttpRequestExecutor | 126 | execute . . . . . . . in '' | 483 | execute in org.apache.http.impl.client.DefaultRequestDirector | 641 | execute . . . . . . . in org.apache.http.impl.client.AbstractHttpClient | 576 | execute in '' | 477 | doRequest . . . . . . in groovyx.net.http.HTTPBuilder | 441 | doRequest in '' | 390 | request . . . . . . . in '' | 56 | index in apps.PaypalController$$EOC4TiIi | 195 | doFilter . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter | 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter | 886 | runTask . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker | 908 | run in '' ^ 619 | run . . . . . . . . . in java.lang.Thread —————–我必须将以下内容添加到BuildConfig.groovy中才能完成这项工作—- … dependencies { // specify dependencies here under either 'build','compile','runtime','test' or 'provided' scopes e.g. compile('org.codehaus.groovy.modules.http-builder:http-builder:0.5.2') { excludes "commons-logging","xml-apis","groovy" } —————————-每个Ralf的响应代码更新————- 代码希望匹配Groovy HTTPBuilder documentation: 注意这会产生相同的错误,同一行,I.E.: org.apache.http.NoHttpResponseException,Message: The target server failed to respond 在该行:http.request(POST){ class PaypalController { def index() { def paypalUrl = "https://pilot-payflowpro.paypal.com?PARTNER=PayPal&VENDOR=ROAdvanced&USER=ROAdvanced&PWD=joespizza1&TRXTYPE=S&MODE=TEST&AMT=40&CREATESECURETOKEN=Y&SECURETOKENID=12528208de1413abc3d60c86cdr87" println "Making new http Builder with paypalURL ..." def http = new HTTPBuilder(paypalUrl) println "Now doing the post as a request per example" // perform a GET request,expecting JSON response data try { http.request(POST) { body = [ status : 'update!',source : 'httpbuilder' ] requestContentType = ContentType.URLENC println "Issued the post waiting for the response" response.success = { resp -> println "in success code" println "My response handler got response: ${resp.statusLine}" println "Response length: ${resp.headers.'Content-Length'}" assert resp.status == 200 //def result = any.results; render(view: "index",result: result]); } println "past the success code" }//end of request } catch (groovyx.net.http.HttpResponseException ex) { println "Had response exception ...." ex.printStackTrace() return null } catch (java.net.ConnectException ex) { println "Had connection exception ...." ex.printStackTrace() return null } finally { http.shutdown() } }//end of method def fail() {} def success() {} } 解决方法
发现你的问题:curl -d不是GET而是POST请求.如果你在你的curl请求中省略了-d,你将遇到与你的groovy相同的问题…
试试这个groovy代码: def url = new URL("https://pilot-payflowpro.paypal.com") def body= "PARTNER=PayPal&VENDOR=ROAdvanced&USER=ROAdvanced&PWD=..." def connection = url.openConnection() connection.setRequestMethod("POST") connection.doOutput = true def writer = new OutputStreamWriter(connection.outputStream) writer.write(body) writer.flush() writer.close() connection.connect() def response = connection.content.text (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |