API를 통해 사용자 정의 필드 업데이트

user_field 값을 업데이트하는 과정을 역추적(reverse engineer)하고 있습니다.

Reverse engineer the Discourse API 에 있는 단계를 따라 테스트 사용자를 편집하고 브라우저의 네트워크 탭에서 어떤 일이 일어나고 있는지 기록했습니다.

이 URL에 PUT 요청을 보내야 한다는 것을 알 수 있습니다: https://example.com/u/my-username-here.json

조금 혼란스러웠던 부분은 JSON 페이로드 대신 formdata가 표시된 것이었습니다. 페이로드는 다음과 같았습니다: user_fields%5B1%5D=some+dji%2C+some+Autel&user_fields%5B5%5D=%40UKDroneClub&user_fields%5B6%5D=%40iKiteFlyer&user_fields%5B8%5D=test&timezone=Europe%2FLondon&default_calendar=none_selected

저는 user_field 값 중 하나만 업데이트하려고 합니다.

URL 인코딩된 형태: user_fields%5B8%5D=test

디코딩하면 다음과 같이 읽힙니다: user_fields[8]=test

(8 = 업데이트하려는 user_field의 id)

이 form data 값을 JSON 페이로드로 변환하여 PUT 요청을 보낼 수 있는 방법은 무엇일까요? :thinking:

여기서 제가 뭘 잘못하고 있는지 정확히 모르겠지만, API 호출을 통해 사용자의 프로필에서 About Me(소개) 섹션은 업데이트할 수 있습니다. 하지만 user_fields 중 어떤 것도 업데이트할 수 없습니다.

사용자를 편집할 때 브라우저 네트워크를 모니터링하면 다음과 같은 PUT 요청이 전송되는 것을 확인할 수 있습니다:

bio_raw=aboutmetest&user_fields%5B1%5D=some+dji%2C+some+Autel&user_fields%5B5%5D=%40UKDroneClub&user_fields%5B6%5D=%40iKiteFlyer&user_fields%5B8%5D=qwerty&timezone=Europe%2FLondon&default_calendar=none_selected

저는 다음 코드를 사용하여 PUT API 호출을 수행하고 있습니다:

' 헤더 추가
request.AddHeader("Content-Type", "application/x-www-form-urlencoded")
request.AddHeader("Accept", "application/json")
request.AddHeader("Api-Key", strAPIKey)
request.AddHeader("Api-Username", strUsername)

' 폼 본문 매개변수 추가
request.AddParameter("bio_raw", DateTime.Now())
request.AddParameter("user_fields%5B8%5D", DateTime.Now())
'request.AddParameter("user_fields[8]", DateTime.Now())

API 호출을 할 때마다 bio_raw 값이 현재 타임스탬프(테스트용)로 업데이트되는 것을 확인할 수 있습니다.

하지만 어째서인지 user_fields[8] 값은 전혀 업데이트되지 않습니다. 에러도 없고, 그냥 업데이트가 되지 않을 뿐입니다.

user_fields%5B8%5D로 URL 인코딩을 시도해 보기도 했고, user_fields[8]로 일반 텍스트로 시도해 보기도 했지만, 둘 다 효과가 없었습니다.

무언가 명백한 것을 놓치고 있는 걸까요? :thinking:

아 진짜 화나겠다 :man_facepalming:

네, 네, 제가 그랬습니다.

이거 때문이죠:

API 호출이 사용자에 의해 수행될 때 user_field의 편집을 막고 있네요.

물론이죠 :exploding_head:

API 호출을 다시 만들어서 system으로 수행하면 잘 동작합니다 :roll_eyes: