Starałem się opublikować diff w aplikacji ReviewBoard za pośrednictwem interfejsu API. Udało mi się zalogować na serwer i utworzyć nowy wpis, ale nie udało mi się poprawnie opublikować zawartości pliku diff.Jak przesłać wiadomość do tablicy recenzji za pośrednictwem interfejsu API?
Jestem nowy na pisanie tego rodzaju aplikacji, ale moim celem jest mieć skrypt jeden krok do:
- diff pliku (pre-commit) z repozytorium SVN,
- add prośba o sprawdzenie do tablicy recenzji i opublikowanie pliku różnic z bieżącego pliku,
Może być później, skrypt może być częścią svn przed zatwierdzeniem haka.
Mój pyton próba wygląda następująco:
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)
Z tym kodem dostaję Bad Request (400) błąd, w szczególności: "jeden lub więcej pól miały błędy" (105).
Mam świadomość, że istnieje kilka bibliotek, które mogą rozmawiać z API ReviewBoard. Jestem również świadomy, że istnieje przegląd końcowy. Wolałbym nie przekazywać innym programistom innej biblioteki Pythona, a post-recenzji wydaje się mniej elastyczna, gdy porównuje się pliki z wielu lokalizacji.
z poniższej sugestii, mam dodać odpowiedź serwera tutaj:
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
Na pierwszy rzut oka Domyślam się, że coś się dzieje z moim obsługi haseł. Nie jestem pewien, co się z tym dzieje. Na wszelki wypadek, w ten sposób generuję moje uwierzytelnienie:
manager_passwd = urllib.request.HTTPPasswordMgr()
manager_passwd.add_password(...)
handler_passwd = urllib.request.HTTPBasicAuthHandler(manager_passwd)
opener = urllib.request.build_opener(handler_passwd)
Wydaje się, że uwierzytelnianie działa. Przetestowałem go, tworząc nowy wpis opinii. Tak więc, kiedy publikuję diff, uwierzytelnianie nie powiedzie się.
plakat wydaje się być dobrym, bardzo dobrym wyborem, ale jest to biblioteka zewnętrzna: [poster_doc] (http://atlee.ca/software/poster/) – KlingonJoe
tutaj jest link do podobnego pytania: [używanie wielostronicowego podajnika do publikowania formularza dane z pythonem] (http://stackoverflow.com/questions/680305/using-multipartposthandhand-to-post-form-data-with-python) – KlingonJoe
Ustaw [poziom debugowania httplib] (http://stackoverflow.com/ pytania/789856 /) do 1, dzięki czemu możesz zobaczyć wysyłane nagłówki, a jeśli nie widzisz problemu, dodaj te informacje w twoim pytaniu. –