Mam problem ze znalezieniem dokładnej specyfikacji tego w standardzie. Mam klienta HTTP, który nie zawiera Content-Length: 0
nagłówka podczas wykonywania żądania PUT, w którym nie określam treści, oraz serwer, który jest zdezorientowany przez takie żądania i zastanawiam się, który program powinienem winić.
92
Odpowiedzi:
Żądania HTTP mają treść, jeśli mają nagłówek Content-Length lub Transfer-Encoding ( RFC 2616 4.3 ). Jeśli żądanie nie zawiera żadnego z nich, nie ma treści, a serwer powinien je tak traktować.
To powiedziawszy, to niezwykłe, że żądanie PUT nie ma treści, więc gdybym projektował klienta, który naprawdę chciałby wysłać pustą treść, przekazałbym Content-Length: 0. Rzeczywiście, w zależności od odczytu POST i definicje metod PUT ( RFC 2616 9.5, 9.6 ) można by argumentować, że treść jest implikowana jako wymagana - ale rozsądnym sposobem obsługi braku treści byłoby przyjęcie treści o zerowej długości.
źródło
PUT
żądanie zasadniczo służy do tworzenia lub aktualizowania pliku na serwerze. I nie ma nic nielegalnego w pustym pliku, prawda?disable
ienable
są czasownikami. W takim przypadku prawdopodobnie wolałbym używaćPATCH
na/users/{id}
punkcie końcowym.Nie odpowiadając na pytanie, ale stwierdzając, w jaki sposób jaxrs pozwala mi na częste używanie bezcielesnych PUTów:
Przykład umieszczania bez ciała: Nadaj użytkownikowi dodatkowe uprawnienia.
PUT / admin / users / {nazwa użytkownika} / pozwolenie / {pozwolenie}
źródło
Treść nie jest wymagana przez standard IETF, chociaż długość treści powinna wynosić 0, jeśli nie ma treści. Użyj metody odpowiedniej do tego, co robisz. Jeśli miałbyś umieścić to w kodzie, to podane
i zdalna zmienna o nazwie
r
.Post jest odpowiednikiem
Put jest równoważne
a get jest równoważne
źródło
int f(int* resource, int body);
a następnie wywołałby POSTf(&r, x);
- co może zrobić lub nie zrobićr
tego, co serwer uważa za stosowne. Ale może też zwrócić rzeczy, więc ... może bardziej jaky = f(&r, x);
.Co jest umieszczane (w sensie czasownika) na serwerze, jeśli nie ma treści? Specyfikacja odnosi się do treści jako „zamkniętą jednostkę”, ale wniosek bez zawartości nie miałby zamkniętą jednostkę, a zatem nic, aby umieścić na serwerze.
O ile, oczywiście, nie chciałeś niczego WCIĄGNĄĆ na serwer, w takim przypadku prawdopodobnie wolałbyś zamiast tego DELETE.
źródło
Content-Length: 0
lub{ }
w JSON jako ciało?Pole długości treści jest wymagane zgodnie z następującą sekcją standardu HTTP / 1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13
źródło