2009-07-29 8 views
9

Czy ktoś wie o sposobie uzyskania tylko parametrów POST z obiektu HttpServletRequest?Pobierz tylko parametry POST (Java)

IE, PHP ma superglobalne $ _POST, a CGI.pm Perla pobiera parametry POST tylko wtedy, gdy metoda HTTP jest POST (domyślnie).

HttpServletRequest.getParameter (String) będzie zawierał parametry URL GET, nawet jeśli metoda HTTP to POST.

+2

Jak rozumiem, chcesz tylko parametry w treści POST, a nie parametry z adresu URL POST. – McDowell

+0

Dokładnie. To dokładniejszy opis. – dankuck

Odpowiedz

6

Zgaduję, że jednym ze sposobów może być ręczne przeanalizowanie HttpServletRequest.getQueryString() i sprawdzenie, czy nie ma w nim parametru.

Naiwny realizacja (pomijając URL uciekł wartości klucza) pójdzie coś takiego (niesprawdzone):

public boolean isInQuery(HttpServletRequest request, String key) { 
    String query = request.getQueryString(); 
    String[] nameValuePairs = query.split("&"); 
    for(String nameValuePair: nameValuePairs) { 
    if(nameValuePair.startsWith(key + "=")) { 
     return true; 
    } 
    } 
    return false; 
} 
+1

To naprawdę proste rozwiązanie. Mimo wszystko brzmi to jak obejście. Zastanawiam się, czy istnieje jakaś standardowa klasa do wykonania pracy. Dla czytelników dodaj tę linię na początku metody: key = URLEncoder.encode (klucz, "UTF-8"); – dankuck

+0

Ach, myślę, że "obejście" jest niewłaściwym słowem. To po prostu źle działa, ponieważ wiem, że tam gdzieś jest kod robiący coś bardzo podobnego. – dankuck

+1

df wymienia klasę o nazwie ParameterParser w klasie Apache HttpClient. Nie jest to w standardowej bibliotece Javy, ale przynajmniej myśli o wszystkich drobiazgach, o których tu zapomnieliśmy. Następnie kod mógłby przejść przez getParameterValues ​​() i zignorować te, które mają jedną z wartości podanych przez ParameterParser.parse(). – dankuck

8

Z mojego zrozumienia, nie ma czegoś takiego jak parametry POST i GET parametry HTTP, tam są metodami POST i GET. Kiedy żądanie jest realizowane za pomocą metody POST, parametry wchodzą w treść wiadomości. W przypadku żądania GET parametry idą w adresie URL.

Moja pierwsza myśl była taka, że ​​był to błąd związany z implementacją w twoim kontenerze serwletów. Ale ponieważ rzeczy nie zawsze są takie, jakich oczekujesz, specyfikacja serwletu java (przynajmniej wersja 2.4) nie rozróżnia dwóch rodzajów parametrów. Tak więc, nie ma sposobu na uzyskanie parametrów postu lub adresu URL za pomocą interfejsu API serwletu.

Z pewnością masz już plan B. Ale na wszelki wypadek, mogę napisać dwie alternatywy, która przyszła mi do głowy:

  1. Jeśli masz dostęp do definicji nazwy parametru, można użyć prefiksu rozróżnić te dwie wartości podczas iteracji wyniku getParameterNames().

  2. Można przeanalizować URL, tworząc obiekt URL i używając metody getQuery(), aby uzyskać tylko parametry. Następnie przeanalizuj parametry ciągu zapytania za pomocą pewnej klasy narzędziowej, takiej jak ParameterParser w bibliotece HttpClient. I wreszcie odejmij te nazwy od wyniku getParameterNames().

+0

Hmm ... Właśnie testuję jedną implementację (Tomcat dla Win32). Czy przetestowałeś jakieś inne? – dankuck

+1

ParameterParser brzmi jak idealny pakiet do zadania identyfikacji parametrów i wartości URL. Wtedy można by użyć czegoś takiego jak mechanizm w odpowiedzi Ykaganovicha. – dankuck

3

nie można po prostu dostać parametry z HttpServletRequest ciągu doPost lub doGet w podklasie HttpServlet?

Wszystko, co złapiesz (przez getParemeter) wewnątrz doPost jest POST i wszystko wewnątrz doGet jest GET.

+0

Próbuję zignorować parametry, które są przekazywane w adresie URL. Są one uwzględniane przez getParameter bez względu na to, która metoda HTTP jest używana. – dankuck

+1

Żądania postów mogą mieć parametry GET i POST. Jeśli jest tylko parametr GET (powiedzmy "pseudonim"), to jeśli wykonasz request.getParameter ("pseudonim") wewnątrz doPost, otrzymasz parametr "pseudonim" GET, który powinien być pusty z twojego wyjaśnienia. – Jamol

1

Nie jestem pewien, czy to zadziała, ale możesz spróbować wyodrębnić surową zawartość ciała POST, używając request.getReader(). Kontener może usunąć te dane przed przekazaniem kontroli do aplikacji, a nawet gdyby nie, trzeba samemu rozszyfrować ciąg parametrów.

+0

Zabawne, jestem bardziej skłonny do korzystania z sugerowanych powyżej pomysłów, ponieważ dane POST mają dwa różne popularne formaty (i dowolną liczbę innych). – dankuck

2

Myślę, że możesz zrobić coś z getMethod() dostępnym z interfejsu HttpServletRequest.

Java doc 1.6

dostępny jest również w 1,4 i 1,5.

+0

To nie powie nic o źródle parametrów. Po prostu powie Ci, która metoda HTTP została użyta w żądaniu. – Yinzara

0

pytanie odpowiedział w this related post:

Normalnie można dostać i parametry odpowiedzieć w serwletu taki sam sposób:

request.getParameter("cmd"); 

Ale tylko wtedy, gdy dane POST jest zakodowany jako klucz-wartość pary treści typ: "application/x-www-form-urlencoded" jak przy używaniu standardowego formularza HTML .