2016-09-27 36 views
10

मैं वर्तमान में अपनी जर्सी 2 आराम सेवा के साथ खेल रहा हूं। दी गई सेवा (विवरण, प्रकार आदि) के बेहतर अवलोकन के लिए मैं स्वैगर (swagger-jersey2-jaxrs) का भारी उपयोग करता हूं। तो मैं अपने सेवा विवरण (swagger.json) को समझने में सक्षम हूं और मैं उन्हें swagger ui के माध्यम से देख और देख सकता हूं।स्वैगर कोडेजन सीएलआई जावा क्लाइंट - इसका उपयोग कैसे करें

अब मैं इस बिंदु पर हूं कि मुझे इन सेवाओं का उपयोग करने के लिए कुछ क्लाइंट बनाने की आवश्यकता है। मैं accrooss swagger codegen cli आया जो आपके क्लाइंट और कई अलग-अलग भाषाओं (मेरे मामले में जावा) उत्पन्न करने के लिए एक अच्छा टूल है। मैं एपीआई क्लाइंट और उपयोग में मॉडल उत्पन्न करने में सक्षम हूं।

यहां मैं पहली समस्या में आया था। आरईएसटी सेवाएं और swagger विवरण http मूल auth संरक्षित हैं। मैंने documentation पढ़ा जिसने मुझे कुछ संकेत दिया कि बुनियादी लेख का उपयोग करने की संभावना है। इस बिंदु पर मुझे यह उल्लेख करना होगा कि मेरे दृष्टिकोण से डॉकमेंटेशन बहुत खराब है। यह कहता है:

-a, --auth स्वैगर परिभाषाओं को दूरस्थ रूप से प्राप्त करते समय प्राधिकरण शीर्षलेख जोड़ता है। नाम की यूआरएल-एन्कोडेड स्ट्रिंग में पास करें: कई मानों को अलग करने वाले अल्पविराम के साथ हेडर।

पहली बात यह है कि मैं एक http शीर्षलेख की तरह एक स्ट्रिंग को पास करना है, लेकिन यह काम नहीं करता है और यहां तक ​​कि घुमावदार क्लि के साथ मूल लेख का उपयोग करने के लिए भी कुछ गुस्सा नहीं हुआ है, जिसके परिणामस्वरूप कुछ स्पष्ट उत्तरदाता नहीं हैं। बहुत सी कोशिशों और त्रुटियों के बाद मैं (मैं सीएलआई 2.1.2 का उपयोग कर रहा हूं) मैं फाइनल सही प्रारूप में आया, उदाहरण के लिए:

जावा -जर swagger-codegen-cli-2.1.2.jar उत्पन्न -a " प्रमाणीकरण: बेसिक YWRtaW46YWRtaW4 = "-i http://localhost:8080/webproject/restapi/swagger.json -l java -o restclient

जहां YWRtaW46YWRtaW4 = व्यवस्थापक का आधार 64 एन्कोडेड मान है: मेरे मामले में व्यवस्थापक।

अभी तक इतना अच्छा है। जेनरेट किए गए जावा क्लाइंट को मूल लेख का भी उपयोग करना पड़ता है। मैंने एपी क्लाइंट से विधियों पर एक नज़र डाली और सेट यूज़रनेम और सेटपासवर्ड पाया। मैंने सोचा कि यह विधियां क्लाइंट को मूल लेख का उपयोग करने के लिए मजबूर करती हैं लेकिन कोई किस्मत नहीं।

इसलिए मैंने जेनरेट किए गए वर्गों विशेष रूप से एपी क्लाइंट और कई जेनरेट किए गए अपीस सर्विस क्लासेस पर गहराई से देखा। मुझे पता चला कि setUsername और setPassword निम्नलिखित की वजह से कोई असर नहीं:

/** 
    * Helper method to set username for the first HTTP basic authentication. 
    */ 
    public void setUsername(String username) { 
    for (Authentication auth : authentications.values()) { 
     if (auth instanceof HttpBasicAuth) { 
     ((HttpBasicAuth) auth).setUsername(username); 
     return; 
     } 
    } 
    throw new RuntimeException("No HTTP basic authentication configured!"); 
    } 

जहां एक ही समय में HashMap निम्नलिखित के रूप में परिभाषित किया गया है:

// Setup authentications (key: authentication name, value: authentication). 
authentications = new HashMap<String, Authentication>(); 
// Prevent the authentications from being modified. 
authentications = Collections.unmodifiableMap(authentications); 

प्रमाणीकरण hashmap अपरिवर्तनीय हो जाता है, लेकिन क्यों? Purpuse क्या है? इसके अलावा वहाँ ApiClinet जो जरूरत प्रमाणन वस्तु इतनी उत्पन्न अंदर कोई सहायक तरीके हैं मैंने किया follwing:

1) बाहर टिप्पणी लाइन प्रमाणीकरणों Collections.unmodifiableMap (प्रमाणीकरणों) तो hashmap फिर से परिवर्तनीय हो जाता है

2) आवश्यक प्रमाणन वस्तु बनाने manualy

HttpBasicAuth authentication = new HttpBasicAuth(); 
authentication.setUsername("admin"); 
authentication.setPassword("admin"); 

3) apiClients प्रमाणीकरण hashmap के लिए प्रमाणन वस्तु जोड़ें:

ApiClient apiClient = new ApiClient(); 
apiClient.setBasePath(basePath); 
apiClient.getAuthentications().put("basic", authentication); 

4) invokeApi विधि संशोधित (ApiClient।जावा)

public String invokeAPI(String path, String method, Map<String, String> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String accept, String contentType, String[] authNames) throws ApiException { 
String authNames2[] = {"basic"}; 
updateParamsForAuth(authNames2, queryParams, headerParams); 
//updateParamsForAuth(authNames, queryParams, headerParams); 
... 

चरण 4 आवश्यक है, क्योंकि ApiServices निम्नलिखित की तरह apiClient विधि आह्वान:

String[] authNames = new String[] { }; 
String response = apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames); 

एक अन्य संभावित समाधान की तरह हर apiService में प्रमाणीकरणों hashmap auf कुंजी परिभाषित करने के लिए किया जाएगा:

String[] authNames = new String[] { "basic" }; 

सभी संशोधन सब कुछ उम्मीद है, लेकिन मैं नहीं कर सकते हैं कि यह एक स्वत: जनरेट की बाकी ग्राहक के पीछे विचार यह है के बारे में सोच के रूप में काम करता है करने के बाद। तो मेरा सवाल यह है: क्या मुझे कुछ बिंदु याद आ रहा है या क्या मुझे लगता है कि एक बीटा समाधान के विकास के तहत स्वैगर जेनरेट क्लाइंट (इस मामले में जावा) के बारे में सोचना चाहिए? कृपया मुझे सही समझें, मुझे लगता है कि पूरे swagger ढांचे (jersey2 समर्थन, openapi, swaggerui, codegen) एक बड़ी बात है और मैं डेवलपर्स प्रयासों की सराहना करता हूं लेकिन मैं कोडजन सही का उपयोग करना चाहता हूं और मुझे नहीं लगता कि पीछे विचार ऐसे में उत्पन्न एपी क्लाइंट और एपी सर्विसेज को इस तरह से अनुकूलित करना है।

उत्तर

8

समस्या यह है कि आपका विनिर्देश उस सुरक्षा के प्रकार का उल्लेख नहीं करता है जिसका आप उपयोग करना चाहते हैं (ए.के.ए. सुरक्षा परिभाषाएं) या कौन सा सुरक्षा परिभाषा अंतिम बिंदु पर लागू होती है।

स्वैगर विनिर्देश here है, लेकिन यह पूरी कहानी नहीं बताता है।

आपको क्या करना है 1. सुरक्षा परिभाषाएं सेट करें। यहां एक साधारण मूल http लेखक परिभाषा है:

securityDefinitions: 
    basic: 
    type: basic 
    description: HTTP Basic Authentication. 

और 2. अंत बिंदु में उस सुरक्षा परिभाषा का उपयोग करें।

paths: 
    /: 
    get: 
     security: 
     - basic: [] 
     responses: 
     200: 
      description: OK 

फिर अपने स्वैगर क्लाइंट कोड को पुन: उत्पन्न करें। इसे अपरिवर्तनीय मानचित्र को सही ढंग से और authNames सरणी सेट अप करना चाहिए।

संबंधित मुद्दे