2011-11-18 6 views
6

मैं अपने एपीआई के माध्यम से समीक्षा बोर्ड में एक अंतर पोस्ट करने के लिए संघर्ष कर रहा हूं। मैंने सर्वर पर लॉगिन करने और एक नई पोस्ट बनाने में कामयाब रहा है, लेकिन मैं diff फ़ाइल की सामग्री को सही ढंग से पोस्ट करने में विफल रहा हूं।आप अपने एपीआई के माध्यम से समीक्षा बोर्ड पर एक अंतर पोस्ट करने के लिए कैसे करते हैं?

मैं आवेदन इस तरह का लेखन के लिए नया हूँ, लेकिन मेरा लक्ष्य करने के लिए एक एक कदम स्क्रिप्ट है: (पूर्व प्रतिबद्ध) SVN भंडार के साथ,

  • ऐड एक फ़ाइल diff

    1. समीक्षा बोर्ड के लिए एक समीक्षा अनुरोध और वर्तमान फ़ाइल से भिन्नता पोस्ट करें,

    बाद में हो सकता है, स्क्रिप्ट एक svn प्री-प्रतिबद्ध हुक का हिस्सा हो सकती है।

    import urllib.request 
    import urllib.parse 
    import os.path 
    
    ... login to the reviewboard server with 
    urllib.request.HTTPBasicAuthHandler ... 
    
    diff_path = '/path/to/file' 
    diff_name = 'my.diff' 
    diff_path = os.path.join(diff_path, diff_name) 
    
    diff_val = open(diff_path,'r') 
    
    # load the diff into the http data POST request 
    diff_header =             \ 
        '-- SoMe BoUnDaRy \n'          \ 
        + 'Content-Disposition: form-data; name=path; filename='  \ 
        + '"' + diff_name + '"\n\n'         \ 
        + diff_val.read() + '\n'          \ 
        + '-- SoMe BoUnDaRy --' 
    
    data ={'path': diff_header, 'basedir': '/path/to/file/in/rep'} 
    print(data['path']) 
    data = urllib.parse.urlencode(data) 
    data = data.encode('utf-8') 
    
    opener.open(          \ 
        'http://xxx.xxx.x.xxx/api/review-requests/26/diffs/', data) 
    
    इस कोड के साथ

    मैं एक गलत अनुरोध (400) त्रुटि मिलती है, विशेष रूप से:

    मेरे अजगर प्रयास की तरह लग रहा है "एक या अधिक फ़ील्ड में त्रुटियां थीं" (105)।

    मुझे पता है कि वहां कुछ पुस्तकालय हैं जो समीक्षा बोर्ड एपीआई से बात कर सकते हैं। मुझे यह भी पता है कि समीक्षा के बाद मौजूद है। मुझे अन्य डेवलपर्स को अन्य पायथन लाइब्रेरी में वितरित करने की आवश्यकता नहीं है और कई स्थानों से फ़ाइलों को अलग करते समय पोस्ट-समीक्षा कम लचीली लगती है।

    CREATING PASSWD MANAGER... 
    CREATING PASSWD MANAGER... done 
    CREATING PASSWD HANDLER... 
    CREATING PASSWD HANDLER... done 
    CREATING URL OPENER... 
    CREATING URL OPENER... done 
    LOADING DIFF... 
    send: b'POST /api/review-requests/26/diffs/ HTTP/1.1\r\nAccept-Encoding: 
        identity\r\nContent-Length: 723\r\nHost: xxx.xxx.x.xxx\r\nContent-Type: 
        application/x-www-form-urlencoded\r\nConnection: close\r\nUser-Agent: 
        [empty no username+password] Python-urllib/3.2\r\n\r\ 
        npath=--+SoMe+BoUnDaRy+++%...[the rest of my post] 
    reply: 'HTTP/1.1 401 UNAUTHORIZED\r\n' 
    header: Date header: Server header: Content-Language header: Expires header: 
        Vary header: Cache-Control header: WWW-Authenticate header: 
        Content-Length header: Last-Modified header: Connection header: 
        Content-Type send: b'POST /api/review-requests/26/diffs/ 
        HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 723\r\nHost: 
        xxx.xxx.x.xxx\r\nUser-Agent: Python-urllib/3.2\r\nConnection: 
        close\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization: 
        Basic [with username+password]\r\n\r\npath= 
        --+SoMe+BoUnDaRy+++%0AContent-Disposition%... 
    reply: 'HTTP/1.1 400 BAD REQUEST\r\n' 
    header: Date header: Server header: Content-Language header: Expires header: 
        Vary header: Cache-Control header: Set-Cookie header: Content-Length header: 
        Last-Modified header: Connection header: Content-Type HTTPError thrown 
    

    पहली नज़र मेरा अनुमान है कि कुछ अपना पासवर्ड हैंडलर के लिए हो रहा है पर:

    नीचे सुझाव से, मैं यहाँ सर्वर प्रतिक्रिया जोड़ने है। मुझे यकीन नहीं है कि इसके साथ क्या हो रहा है। बस मामले में, इस प्रकार मैं अपना प्रमाणीकरण उत्पन्न कर रहा हूं:

    manager_passwd = urllib.request.HTTPPasswordMgr() 
    manager_passwd.add_password(...) 
    handler_passwd = urllib.request.HTTPBasicAuthHandler(manager_passwd) 
    opener = urllib.request.build_opener(handler_passwd) 
    

    प्रमाणीकरण काम करने लगता है। मैंने एक नई समीक्षा पोस्ट बनाकर इसका परीक्षण किया है। तो यह तब होता है जब मैं diff पोस्ट करता हूं कि प्रमाणीकरण विफल रहता है।

  • +0

    पोस्टर एक बहुत अच्छी पसंद की तरह लगता है, लेकिन यह एक बाहरी lib है: [poster_doc] (http://atlee.ca/software/poster/) – KlingonJoe

    +0

    यहां एक समान प्रश्न का एक लिंक है: [फ़ॉर्म पोस्ट करने के लिए मल्टीपार्टपोस्टैंडलर का उपयोग करना पायथन के साथ डेटा] (http://stackoverflow.com/questions/680305/using-multipartposthandler-to-post-form-data-with-python) – KlingonJoe

    +0

    सेट करें [fansplib डीबग स्तर] (http://stackoverflow.com/ प्रश्न/78 9 856 /) से 1 ताकि आप हेडर भेजे जा सकें, और यदि आपको समस्या दिखाई नहीं दे रही है, तो कृपया उस सूचना को जोड़ें आपके प्रश्न में –

    उत्तर

    2

    समीक्षाबोर्ड पहले से ही उनके एपीआई के साथ diff पोस्ट करने के लिए एक पायथन उपकरण है, इसे postreview.py कहा जाता है। आप इसे पाया जा सकता है:

    http://reviewboard.googlecode.com/svn/trunk/wxpostreview/postreview.py

    ले लो और प्रवेश के लिए अपने ReviewBoardServer का उपयोग करें और एक diff पोस्ट!

    (इसके अलावा, अपने अनुरोध में, authentification आवश्यक है हाँ, लेकिन यह भी कुकी फ़ाइल। यही कारण है कि आप 2 अनुरोध (प्रवेश के लिए एक अंतर भेजने के लिए एक और एक की जरूरत है और कुकी मिलता है, है।))

    +0

    धन्यवाद, समीक्षा बोर्डवर्ड एक अच्छा सुझाव है। मुझे अब सभी पोस्ट-समीक्षा के माध्यम से घूमना नहीं है। – KlingonJoe

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