Tôi đã đấu tranh để đăng một sự khác biệt lên ReviewBoard thông qua API của họ. Tôi đã quản lý để đăng nhập vào máy chủ và tạo một bài đăng mới, nhưng tôi đã không đăng chính xác nội dung của tệp khác.Làm thế nào để bạn đăng một khác biệt lên ReviewBoard thông qua API của nó?
Tôi mới để viết loại ứng dụng, nhưng mục tiêu của tôi là phải có một kịch bản một bước để:
- diff một tập tin (pre-cam) với kho svn,
- add yêu cầu đánh giá để Xem lại và đăng sự khác biệt từ tệp hiện tại,
Có thể sau này, tập lệnh có thể là một phần của móc trước svn.
nỗ lực python của tôi trông giống như:
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)
Với mã này tôi nhận được một YÊU CẦU BAD (400) lỗi, cụ thể là: "Một hoặc nhiều lĩnh vực có lỗi" (105).
Tôi biết rằng có một số thư viện ở đó có thể nói chuyện với API ReviewBoard. Tôi cũng biết rằng bài đánh giá sau tồn tại. Tôi không muốn phải phân phối cho các nhà phát triển khác một thư viện python và sau khi xem xét có vẻ ít linh hoạt khi các tập tin diffing từ nhiều địa điểm.
Từ gợi ý dưới đây, tôi đã thêm các phản ứng máy chủ ở đây:
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
Thoạt nhìn tôi đoán là một cái gì đó đang xảy ra để xử lý mật khẩu của tôi. Tôi không chắc điều gì đang xảy ra với nó. Chỉ trong trường hợp, đây là cách tôi tạo xác thực của mình:
manager_passwd = urllib.request.HTTPPasswordMgr()
manager_passwd.add_password(...)
handler_passwd = urllib.request.HTTPBasicAuthHandler(manager_passwd)
opener = urllib.request.build_opener(handler_passwd)
Xác thực có vẻ hoạt động. Tôi đã thử nghiệm nó bằng cách tạo một bài đánh giá mới. Vì vậy, đó là khi tôi đăng các diff rằng xác thực không thành công.
poster có vẻ giống như một sự lựa chọn tốt, nhưng nó là một lib bên ngoài: [poster_doc] (http://atlee.ca/software/poster/) – KlingonJoe
đây là một liên kết đến một câu hỏi tương tự: [using multipartposthandler to post form dữ liệu với python] (http://stackoverflow.com/questions/680305/using-multipartposthandler-to-post-form-data-with-python) – KlingonJoe
Đặt [mức gỡ rối httplib] (http://stackoverflow.com/ câu hỏi/789856 /) đến 1 để bạn có thể xem tiêu đề được gửi và nếu bạn không thấy vấn đề thì hãy thêm thông tin đó trong câu hỏi của bạn. –