Wysłanie posta do serwera - Java REST POST TOKEN

Wysłanie posta do serwera - Java REST POST TOKEN
B2
  • Rejestracja:około 4 lata
  • Ostatnio:7 miesięcy
  • Postów:22
0

Hey, zwracam się z prośbą. Próbuje napisać posta który będzie uderzał w konkretny adres i z jakim problemem sie spotykam. Jeżeli w restman-ie wysyłam sobie posta to dostaje status kodu 200 ale.... No właśnie ale jeżeli wysyłam to w formularzu to mam sukces, jeżeli surowe dane to juz jest problem.screenshot-20210715225007.png Dostaje status kodu 200 jednak pojawia się błąd z tokenem. W przypadku wysłania danych w formularzu wszystko działa ok: screenshot-20210715225129.png
Czy da się to napisać w javie tak jak jest z zrobione z formularzem? Czy ktos ma jakieś pomysły z czego moze wynikac błąd z tokenem?

szatkus
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 3 lata
  • Postów:227
1

Wygląda jakbyś używał jakiegoś patologicznego API, które miesza sobie formdata z jsonem (albo używasz go inaczej niż twórca sobie wymyślił). Na pewno się da w Javie to zrobić, choćby formatując dane jako formdata. Pytanie czego używasz do robienia zapytań.


𐤃𐤐𐤀
edytowany 1x, ostatnio: szatkus
B2
@szatkus: Dzięki za szybką odpowiedź. Jeżeli dobrze Cię rozumiem to używałem HttpPost i HttpURLConnection. Masz może lepszą propozycje?
szatkus
Tak na szybko to nie wiem, od biedy możesz wysłać body token=[tutaj token]&method=addProduct&parameters=[tutaj ten json] i odpowiedni content-type w nagłówku (application/ x-www-form-urlencoded). Ale pewnie da się to zrobić bardziej cywilizowanie.
B2
NIestety nadal ten sam błąd - {"status":"ERROR","error_code":"ERROR_EMPTY_TOKEN","error_message":"No user token provided."} :((((
szatkus
Postaw sobie mockowy serwer HTTP, uderz do niego z Restmana i Javy. Porównaj to co przychodzi.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

A ten token to nie jest czasem CSRF który zmienia sie co request? I musiałbyś zrobić GET, odczytać token i dopiero potem POST z tym tokenem? :)
No i byłoby prościej jakbyś pokazał jak wygląda cały request który leci z formualrza (w przeglądarce dajesz inspect a potem network) bo teraz to wróżymy z fusów.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
szatkus
Zakładając, że API zwraca sensowne kody błędów to wychodzi, że token jest empty czyli w ogóle go nie widzi. Ale z drugiej strony to API zwraca status 200 i text/html z JSONem opisującym błąd, więc to może nie być dobre załozenie.
B2
  • Rejestracja:około 4 lata
  • Ostatnio:7 miesięcy
  • Postów:22
0

@Shalom: screenshot-20210715232829.png Czy o to chodziło?

szatkus
Kliknij "view source"
B2
  • Rejestracja:około 4 lata
  • Ostatnio:7 miesięcy
  • Postów:22
0

@szatkus: oke mam screenshot-20210715233721.png

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No to widzisz ze formularz wysyła jakiś multipart z jakimiś różnymi rzeczami w środku. Trudno powiedzieć czy to API łyka jakieś normalne jsonowe payloady czy tylko taką sieczkę. Spróbuj z Javy zbudować taki multipart request i zobacz czy zadziała. A ten token się zmienia co GET? Bo jeśli tak, to na 99% to CSRF i musisz najpierw zrobić GET żeby pobrać token.

Sprawdź najpierw z tym tokenem wysyłając normalnego jsona.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
B2
Nie, token jest staly
endrius
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Warszawa
  • Postów:101
1

Taki jest przykład u nich:
Sample: https://api.baselinker.com/connector.php , POST: token=1-23-ASOIM234MFDSK534LDS &method=getOrders &parameters={"date_from": 1407341754}

Ja mam to tak rozwiązane w C# robione dawno temu :

Kopiuj
                {
                    var data = new NameValueCollection();
                    data["token"] = token;
                    data["method"] = "getOrders";
                    data["parameters"] = "{\"order_id\": Id zamówienia}"; 

                    var response = wb.UploadValues(url, "POST", data);
                 } 

A tak wygląda z Postmana wybierając Java - Unirest:

Kopiuj
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("https://api.baselinker.com/connector.php")
  .multiPartContent()
  .field("token", "wartość tokenu")
  .field("method", "getOrders")
  .field("parameters", "{
    \"date_confirmed_from\": 1407341754,
    \"get_unconfirmed_orders\": false
}")
  .asString();
edytowany 3x, ostatnio: endrius
B2
  • Rejestracja:około 4 lata
  • Ostatnio:7 miesięcy
  • Postów:22
0

Podczas próby skorzystania z kodu generowanego przez postmana sypie błędami. Nie mogę w żaden sposób zaimplementować pewnych funkcji. Wygenerowany kod wygląda następująco:

Kopiuj
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("token","3001721-3007744-9M92QYNC27FVANV3XXTNKXRIJQxxxxxxxxxxxxxxxxxxxxxxxxxxx")
  .addFormDataPart("method","addProduct")
  .addFormDataPart("parameters","{
    \"storage_id\": \"bl_1\",
    \"name\":\"kielba\",
    \"category_id\":197756
    }")
  .build();
Request request = new Request.Builder()
  .url("https://api.baselinker.com/connector.php")
  .method("POST", body)
  .build();
Response response = client.newCall(request).execute();

Natomiast intelij mówi coś takiego:
screenshot-20210720231612.png
Po dodaniu zależności nadal prosi o ich dodanie ;///

edytowany 2x, ostatnio: betowen27
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie wierze ze w jednej linijce ma być new... i .Builder() albo .newBuilder()
Zamiast bezmyślnie stukać w klawiaturę zwyczajnie popatrz w API, zobacz jakie metody są dostepne i popraw ten kod. Np. już na oko widzę ze importujesz klasę RequestBody nie tą co trzeba, bo jest żółta więc wziąłeś adnotacje springową zamiast interfejsu z OkHttp xD Ty w ogóle wiesz co robisz?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
B2
Ok z requestbody masz rację, ale jeżeli chodzi o new i Builder taki kod wygenerował postman więc powinien działać czyż nie?
szatkus
Patrząc na szybko na dokumentację to w wersji OkHttp 4.0 zrobili jakąś rewolucję, a ten kod, który wygenerował Postman jest dla wersji 3.12.
Shalom
Nie wiem, równie dobrze może to być kod generowany dla wersji biblioteki 10 lat temu, czyż nie? ;)
Charles_Ray
Kod wygenerowany, robota zrobiona. Niestety okazało się, że jeszcze trzeba umieć dodać odpowiednie importy :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.