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. Dostaje status kodu 200 jednak pojawia się błąd z tokenem. W przypadku wysłania danych w formularzu wszystko działa ok:
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?
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ń.
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.
@Shalom: Czy o to chodziło?
@szatkus: oke mam
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.
Taki jest przykład u nich:
Sample: https://api.baselinker.com/connector.php , POST: token=1-23-ASOIM234MFDSK534LDS &method=getOrders ¶meters={"date_from": 1407341754}
Ja mam to tak rozwiązane w C# robione dawno temu :
{
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:
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();
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:
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:
Po dodaniu zależności nadal prosi o ich dodanie ;///
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?