2015-01-27 23 views
5

Sau khi tìm kiếm một lúc, tôi đã tìm thấy các giải pháp sau cho cuộc gọi api yêu cầu phương thức Xóa.Python Xóa Yêu cầu cho api còn lại (trên gae)

thử đầu tiên: (httplib thư viện)

url = '/v1/users/'+ spotify_user_id +'/playlists/'+ playlist_id +'/tracks' 
    data = json.dumps({"tracks": [{ "uri" : track_uri }]}) 
    headers = { 
     'Authorization' : 'Bearer ' + access_token, 
     'Content-Type' : 'application/json' 
     } 

    conn = httplib.HTTPSConnection('api.spotify.com') 
    conn.request('DELETE', url , data, headers) 
    resp = conn.getresponse() 
    content = resp.read() 
    return json.loads(content) 

này trả về:

{u'error ': {u'status': 400, u'message ': u'Empty JSON cơ thể '}}

Second try:. (urllib2 thư viện)

url = 'https://api.spotify.com/v1/users/'+ spotify_user_id +'/playlists/'+ playlist_id +'/tracks' 
    data = json.dumps({"tracks": [{ "uri" : track_uri }]}) 
    headers = { 
     'Authorization' : 'Bearer ' + access_token, 
     'Content-Type' : 'application/json' 
     } 

    opener = urllib2.build_opener(urllib2.HTTPHandler) 
    req = urllib2.Request(url, data, headers) 
    req.get_method = lambda: 'DELETE' 

    try: 
     response = opener.open(req).read() 
     return response 
    except urllib2.HTTPError as e: 
     return e 

này trả về:

HTTP 400 Bad Request

tôi có các chức năng khác nơi JSON đang làm việc, vì vậy tôi đoán vấn đề là với phương pháp DELETE nhưng tôi không thể làm cho nó làm việc.

Bên cạnh đó, webapp đang chạy trên công cụ ứng dụng của Google nên tôi không thể cài đặt gói vì vậy tôi muốn giữ nguyên trong các thư viện được cài đặt sẵn.
Bất kỳ ai cũng có cách tốt để thực hiện yêu cầu Xóa trên GAE? (Tôi cần phải gửi cả dữ liệu và tiêu đề)

API là spotify: developer.spotify.com/web-api/ và tôi đang cố xóa một bản nhạc khỏi danh sách phát.

+1

Cảm ơn bạn rất nhiều vì đã nỗ lực đặt câu hỏi của bạn. Bạn đã làm mới niềm tin của tôi vào SO, ít nhất là trong một ngày. –

+0

Ví dụ thứ hai của bạn có vẻ lạ Bạn đã xem xét việc thử urlfetch - nó hỗ trợ phương thức DELETE. https://cloud.google.com/appengine/docs/python/urlfetch/fetchfunction –

+0

Tôi đã cố gắng sử dụng urlfetch và tôi nhận được phản hồi này: {u'error ': {u'status': 400, u 'message': cơ thể JSON u'Empty. '}} – NBajanca

Trả lời

3

Sau nhiều nghiên cứu, tôi phát hiện ra điều đó là không thể.

Như đã trình bày ở RFC 7231 (nhờ @lukasa đã chỉ ra rằng RFC 2616 là lỗi thời), liên quan đến phương pháp DELETE:

Các yêu cầu phương pháp DELETE rằng máy chủ gốc loại bỏ các hiệp hội giữa tài nguyên mục tiêu và chức năng hiện tại của nó. Trong thực tế, phương pháp này tương tự như lệnh rm trong UNIX: nó thể hiện thao tác xóa trên ánh xạ URI của máy chủ gốc thay vì mong đợi rằng thông tin liên quan trước đó bị xóa .

Điều đó nói rằng việc xóa bản nhạc không cần track_uri được truyền trong phần nội dung, nhưng phải nằm trong URI.

Ngoài ra, trong RFC:

Một tải trọng trong một thông điệp yêu cầu DELETE không có ngữ nghĩa được xác định; gửi nội dung tải trọng theo yêu cầu DELETE có thể gây ra một số hiện thực triển khai để từ chối yêu cầu.

Máy ứng dụng của Google là một trong những trường hợp này, không cho phép yêu cầu DELETE có cơ thể.

Điều đó nói rằng phản ứng từ Spotify làm cho tất cả các cảm giác:

rỗng thân JSON.

Cách tốt nhất để tìm nạp URL trong các ứng dụng google có lẽ their API for it và tôi đang sử dụng nó biết cho phần còn lại của các yêu cầu. (Đối với những người đang sử dụng GAE và đấu tranh giữa httplib, urllib2 và những người khác).

Bài đăng tôi đã sử dụng để tham khảo là this one.

Tôi đã hỏi Spotify nếu có giải pháp thay thế và phản hồi từ họ là Xóa nhận xét của tôi về Disqus !!

+0

Cập nhật về điều này. [RFC 7231 Mục 4.3.5] (https://tools.ietf.org/html/rfc7231#section-4.3.5), thay thế liên kết của bạn thành RFC 2616, nói rằng "Một tải trọng trong một thông báo yêu cầu DELETE không có ngữ nghĩa được xác định; việc gửi một phần tải trọng theo yêu cầu DELETE có thể gây ra một số hiện thực để từ chối yêu cầu. " Điều này không giống như nói rằng một tải trọng trên DELETE bị cấm: nó hoàn toàn được cho phép. Tuy nhiên, nó có nghĩa là sử dụng một là khôn lanh và tốt nhất tránh. – Lukasa

+0

Trong khi chúng ta ở đây, có thể hữu ích khi lưu ý rằng tất cả các thư viện HTTP Python cho phép bạn gửi một cơ thể khi bạn không sử dụng GAE: chỉ trên GAE chúng có cấm chúng không. – Lukasa

+0

Cảm ơn @Lukasa, tôi đã chỉnh sửa câu trả lời của mình với RFC mới. Câu trả lời vẫn giữ nguyên vì Spotify đã xóa nhận xét của tôi về Disqus – NBajanca

Các vấn đề liên quan