여러분, API를 통해 게시글을 업데이트할 때 Content-Type으로 application/json을 사용할 수 있을까요? 문서에는 가능하다고 나와 있지만, 불가능할지도 모르겠다는 생각이 들기 시작했습니다.
항상 ["BAD CSRF"] 오류가 발생하는데, 이게 무슨 의미인지 전혀 모르겠습니다.
multipart/form-data를 사용해야 한다면, PUT 요청을 어떻게 구성해야 하는지, 특히 data 부분을 어떻게 만들어야 하는지에 대한 조언을 주실 수 있을까요?
header = CaseInsensitiveDict()
header["Authorization"] = '{"api-key": "longapikey", "api-username": "myusername"}'
{
"post": {
"raw": "Cool post, but here's an updated to the post's body",
"edit_reason": "I changed this because I can."
}
}
resp = requests.put(url, headers=headers, data=data)
GET 요청이 작동하는 반면 Authorization 헤더를 잘못된 방식으로 사용하면서 PUT 요청이 작동하지 않는다면, 아마도 PUT 요청에 어떤 형식 오류가 있는 것 같습니다. GET 요청은 인증이 전혀 필요 없기 때문에 작동하는 것입니다. Authorization 헤더를 전달하더라도 우리는 이를 확인하지 않습니다. 공개 엔드포인트에 대한 GET 요청은 헤더 없이도 정상적으로 작동합니다.
@pedroleaoc 인증된 요청을 보내고 put/post 요청의 요청 데이터를 전송하는 방법을 보여주는 간단한 파이썬 스크립트 샘플입니다.
# discourse-api-demo.py
import requests
from requests.structures import CaseInsensitiveDict
# 공개 URL에 대한 기본 GET 요청, 헤더 불필요.
url = "http://localhost:3000/posts/10.json"
resp = requests.get(url)
print(resp.status_code)
print(resp.content)
# 비공개 엔드포인트에 대한 GET 요청. 인증 헤더가 필요합니다.
url = "http://localhost:3000/admin/users/list/active.json"
headers = {'Api-Username': 'system', 'Api-Key': '5c1c57915e2...'}
resp = requests.get(url, headers=headers)
print(resp.status_code)
print(resp.content)
# 요청 본문이 있는 PUT 요청
url = "http://localhost:3000/posts/10.json"
data = { 'raw': "Cool post, but here's an updated to the post's body", 'edit_reason': "I changed this because I can." }
resp = requests.put(url, headers=headers, json=data)
print(resp.status_code)
print(resp.content)
이 바로 위에 있는 제 게시물을 참고해 주세요. 요청에서 data=data 형식 대신 json=data를 사용하면 python requests 라이브러리가 content-type을 자동으로 처리하여 application/json으로 설정해 줍니다. 이것이 사용해야 할 올바른 형식입니다.
다만 한 가지 문제가 더 있습니다. 제가 사용 중인 키는 global입니다. write와 read 권한만 있는 키로 시도하면 You are not permitted to view the requested resource. The API username or key is invalid.라는 오류가 발생합니다. GUI를 통해 게시물을 수정하면 실제로 게시물을 수정하는 posts/post_id.json 요청 외에 해당 토픽 URL로 PUT 요청이 하나 더 보내지는 것 같은데, 이 요청은 제한된 API 키로는 재현할 수 없고, global 키로만 가능합니다. 하지만 GUI에서 발생하는 이 추가 PUT 요청이 없더라도 API를 통해 게시물을 수정할 수 없는 이유는 무엇인지 이해가 되지 않습니다.
수정: 기술적으로 제 API 키는 PUT 요청이 향하는 /t/:slug/:topic_id를 포함합니다.