[ caca1 @ 05.03.2020. 13:17 ] @
Klijent je java program i preko REST(post metode) treba da upise odredjeni input na veb server.
Server stalno vraća odgovor:
{"status":200,
"status_message":"ws dostupan",
"response":{
"code":"0", "msg":"Nesipravan broj elemenata JSON zahteva"}}

a moj testni input je
String input = "{"
+ "\"idZu\":11111111,"
+ "\"user\":\"ooooooo\","
+ "\"pass\":\"lllllllllll\","
+ "\"type\":1,"
+ "\"MB\":\"11111111\","
+ "\"PIB\":\"222222222\","
+ "\"JBBK\":\"88888\","
+ "\"MBZu\":\"3333333\","
+ "\"PIBZu\":\"4444444\","
+ "\"datumUgovora\":\"15.01.2020\","
+ "\"brojUgovora\":\"01-43/19-218/1\","
+ "\"brojOkvirnogSporazuma\":\"101-3/19\","
+ "\"kpp\":\"078\","
+ "\"iznosUgovoraBezPDV\":1000.00,"
+ "\"iznosPDV\":100.00,"
+ "\"iznosUgovoraSaPDV\":1100.00"
+ "}";
U dokumentaciji ima 16 obaveznih parametara metoda , toliko imam i u inputu i sva polja sa leve strane su ispravno napisane.
Molim za neku sugestiju gde grešim.
Hvala
[ nemnesic @ 05.03.2020. 13:25 ] @
Jel možeš da postavis tu dokumentaciju da bi video šta tačno treba ? Ako neces javno slobodno me direktno kontaktiraj.
[ Java Beograd @ 05.03.2020. 13:52 ] @
U tvom kodu su neke vrednosti bez navodnika, što je OK ako su numerici, ali nije OK ako se očekuje String.
I obratno. MB ti je na primer u navodnicima, kao da je String a možda se očekuje numerička vrednost.

Da li u dokumentaciji imaš decidno šta je String a šta je numerik?
[ Java Beograd @ 05.03.2020. 13:58 ] @
JSON je OK, uredno se parsuje

{
"idZu": 11111111,
"user": "ooooooo",
"pass": "lllllllllll",
"type": 1,
"MB": "11111111",
"PIB": "222222222",
"JBBK": "88888",
"MBZu": "3333333",
"PIBZu": "4444444",
"datumUgovora": "15.01.2020",
"brojUgovora": "01-43/19-218/1",
"brojOkvirnogSporazuma": "101-3/19",
"kpp": "078",
"iznosUgovoraBezPDV": 1000.0,
"iznosPDV": 100.0,
"iznosUgovoraSaPDV": 1100.0
}
[ caca1 @ 05.03.2020. 14:34 ] @
Ovo je deo uputstva koji se odnosi na odredjeni input.
Obavezni parametri metode su:
a) idZu – INT, matični broj dobavljača.
b) user – korisničko ime dobavljača.
c) pass – lozinka dobavljača
d) type – INT, vrsta ugovora sa mogućim vrednostima: 1 – za osigurana lica RFZO ili 2 – za ostala lica.
e) MB – VARCHAR, matični broj dobavljača.
f) PIB – VARCHAR, poreski identifikacioni broj dobavljača.
g) JBBK – VARCHAR, jedinstveni broj budžetskog korisnika dobavljača (ukoliko je dobavljač budžetski korisnik).
h) MBZu – VARCHAR, matični broj zdravstvene ustanove.
i) PIBZu – VARCHAR, poreski identifikacioni broj zdravstvene ustanove.
j) datumUgovora – VARCHAR, format dd.mm.YYYY (primer 31.12.2018), datum ugovora između zdravstvene ustanove i dobavljača.
k) brojUgovora – VARCHAR, broj ugovora između zdravstvene ustanove i dobavljača.
l) brojOkvirnogSporazuma – VARCHAR, broj okvirnog sporazuma između zdravstvene ustanove i dobavljača.
m) kpp – VARCHAR, ugovorena naknada sa zdravstvenom ustanovom (KPP iz šifarnika RFZO).
n) iznosUgovoraBezPDV – DECIMAL, (KORISTITI TAČKU ZA DECIMALNI UNOS) iznos ugovora bez PDV-a.
o) iznosPDV – DECIMAL, (KORISTITI TAČKU ZA DECIMALNI UNOS), iznos PDV-a.
p) iznosUgovoraSaPDV – DECIMAL, (KORISTITI TAČKU ZA DECIMALNI UNOS) iznos ugovora sa PDV-om.
[ nemnesic @ 05.03.2020. 14:51 ] @
>
[ Java Beograd @ 05.03.2020. 14:52 ] @
Jbg, sve si lepo uradio.
Morao bi da kontaktiraš administratora web servisa, da ti da stack trace, ili neko bolje objašnjenje.
[ caca1 @ 05.03.2020. 14:58 ] @
Poslala sam juce pre podne i danas email za sugestiju ali ne odgovaraju. To je RFZO . Drugi dan kako se vrtim oko ovog testa.
[ nemnesic @ 05.03.2020. 15:33 ] @
Koji endpoint koristis? Ako je ovaj: https://ws.rfzo.rs/Fin/ObavezeUpis onda endpoint je pogresan.
Mislim po dokumentaciji bi trebala da koristis ovaj : https://ws.rfzo.rs/Fin/UgovorUpis

Ali je sve to ovako slepo
npr kada ovaj json posaljem ovde: https://ws.rfzo.rs/Fin/ObavezeUpis dobijem tu gresku
ali kada posaljem ovde: https://ws.rfzo.rs/Fin/UgovorUpis dobijam tacnu gresku "Nepostojeci korisnik"

[ bokinet @ 05.03.2020. 15:37 ] @
Deo oko vaseg JSON, mozda nema veze ali ne nuzno moze da bude posto zavisi kakav je kod njih backend i sta radi oko parsovanja podataka po prijemu zahteva:

Code:

"iznosUgovoraBezPDV": 1000.0,
"iznosPDV": 100.0,
"iznosUgovoraSaPDV": 1100.0


prebaciti u oblike navedenih dole

Code:

"iznosUgovoraBezPDV": "1000.0",
"iznosPDV": "100.0",
"iznosUgovoraSaPDV": "1100.0"


ili

Code:

"iznosUgovoraBezPDV": 1000.00,
"iznosPDV": 100.00,
"iznosUgovoraSaPDV": 1100.00



ili

Code:

"iznosUgovoraBezPDV": "1000.00",
"iznosPDV": "100.00",
"iznosUgovoraSaPDV": "1100.00"


ali takodje proveriti i da li je autentikacija user-a koji vrsi slanje podataka dobro (usr/pwd/api token i sl. sta vec ide za te namene)
[ caca1 @ 05.03.2020. 15:58 ] @
Ovo je kod.

private void prenos() {
try {
URL url = new URL(
"https://ws.rfzo.rs/FinTest/UgovorUpis");
// "https://ws.rfzo.rs/Fin/UgovorUpis");
HttpURLConnection
conn =
(HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);//
conn.setRequestProperty("Content-Type",
"application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestMethod("POST");
String input = "{"
+ "\"idZu\":11111111,"
+ "\"user\":\"ooooooo\","
+ "\"pass\":\"lllllllllll\","
+ "\"type\":1,"
+ "\"MB\":\"11111111\","
+ "\"PIB\":\"222222222\","
+ "\"JBBK\":\"88888\","
+ "\"MBZu\":\"3333333\","
+ "\"PIBZu\":\"4444444\","
+ "\"datumUgovora\":\"15.01.2020\","
+ "\"brojUgovora\":\"01-43/19-218/1\","
+ "\"brojOkvirnogSporazuma\":\"101-3/19\","
+ "\"kpp\":\"078\","
+ "\"iznosUgovoraBezPDV\":1000.00,"
+ "\"iznosPDV\":100.00,"
+ "\"iznosUgovoraSaPDV\":1100.00"
+ "}";
//---zahtev serveru---------------
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
os.close();

if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
//---Odgovor servera----------------------------------------------------------------
BufferedReader br = new BufferedReader(
new InputStreamReader(
(conn.getInputStream())));

String output=null;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {

System.out.println(output);
}

br.close();
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null,e);
//e.printStackTrace();

}

}
Ko inputa su samo pravi podaci zamenjeni .

[Ovu poruku je menjao caca1 dana 05.03.2020. u 17:09 GMT+1]
[ caca1 @ 06.03.2020. 08:29 ] @
nemnesic Posto si vec pretpostavio koji je URL poslala sam ti na pp pravi input, a i vidi se na prethodnom postu metod koji to treba da odradi.
Pa ako mozes probaj da vidimo koju ces ti poruku dobiti. Prvi put radim ovu komunikaciju sa veb serverom pa mislim da negde mozda gresim.
[ nemnesic @ 06.03.2020. 19:25 ] @
ok odgovorio sam mada mislim na kraju bi trebala da ovde stavis konacno resenje problema
[ caca1 @ 07.03.2020. 09:43 ] @

nemnesic
Nije mi jasan tvoj odgovor. Ja i dalje imam isti odgovor sa veb servisa RFZO. Poslala sam ti pravi input da ti probas da ga prosledis na test veb servis da vidimo da li ti dobijas isti odgovor. U svakom slucaju kada budem saznala gde je problem ovde cu ga i napisati.
[ caca1 @ 07.03.2020. 10:50 ] @
Nemanja izvini, sada sam tek videla odgovor na pp. Sada cu probati.
[ Deunan @ 07.03.2020. 10:50 ] @

Meni izbacuje:
Code:
Output from Server .... 

{"status":200,"status_message":"WS dostupan","response":{"code":"1","msg":"Nepostojeci korisnik"}}


Nista menjano, samo prekopirano. Deluje da radi...
[ caca1 @ 07.03.2020. 12:23 ] @
Nemanja
Kada kopiram tvoj input u moj metod prenos() ,gore navedeni, javlja greske.
A poruka koji si ti dobio "Nepostojeci korisnik" je verovatno zato sto je prvo polje int a ne String.
Kao sto si napomenuo, izgleda da ne mogu da ja formatiram u input vec da se to radi na drugi nacin.
Predlozio si da koristim jackson library za formatiranje tako da cu sada to da istrazim jer sve ovo radim prvi put.
Posto si dobio odg od veb servisa "Nepostojeci korisnik" znaci na neki drugi nacin ci prosledio input a ne kao ja preko moje metode prenos()?
[ nemnesic @ 07.03.2020. 13:43 ] @
Tacno - nisam koristio tvoj kod i "prenos" metodu. Vec sam koristio postman i direktno POST-ovao json.

Bilo kako bilo moraces da se upoznas kako da koristis neke biblioteke sa pravilno pravljenje json-a. Olaksace ti posao i ne treba da brines da li je formatirano pravilno ili ne.

Ja bi preporucio da napravis java projekat koji koristi neki od alata za upravljanje/izgradnju ("build") projekta - npr maven ili gradle (ja koristim gradle)

Za generisanje maven/java pojekta:
https://maven.apache.org/archetypes/maven-archetype-quickstart/

Za generisanje gradle/java projekta:
https://guides.gradle.org/building-java-applications/

Onda povuces biblioteke koje su ti potrebne lakse (jackson itd)

javi se ako nesto zaglavi
[ caca1 @ 07.03.2020. 20:06 ] @
Nemanja
radila sam po tvom prvom predlogu.
Napravila sam klasu Ugovor i onda sam je preko mapper.writeValueAsString(u) prebacila u input i dobila poruku koju si i ti dobio "Nepostojeci korisnik".

public class Ugovor {
private int idZu;
private String user;
.....
public int getIdZu() {
return idZu;
}
public void setIdZu(int idZu) {
this.idZu = idZu;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
.....
}

i onda sam promenila moj testni metod prenos() u
URL url = new URL(
"https://ws.rfzo.rs/FinTest/UgovorUpis");
// "https://ws.rfzo.rs/Fin/UgovorUpis");
HttpURLConnection
conn =
(HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);//
conn.setRequestProperty("Content-Type",
"application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestMethod("POST");
try {
Ugovor u = new Ugovor();

u.setIdZu(1111111);
u.setUser("aaaaa");
...........
ObjectMapper mapper = new ObjectMapper();
String input = mapper.writeValueAsString(u);
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
os.close();
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
} catch ......
i javlja poruku {"status":200,"status_message":"WS dostupan","response":{"code":"1","msg":"Nepostojeci korisnik"}}
Po ovoj poruci input je prosledjen veb servisu ali nije prepoznao idZu. Mozda nisu evidentirali mat.br dob. u svojoj bazi da li je to moguce ?
[ nemnesic @ 07.03.2020. 20:44 ] @
super vazno da radi. A greska koju javljaju mislim da user/pass koji saljes nisu tacni. Ali to najbolje sa njima da vidis.
[ caca1 @ 07.03.2020. 20:53 ] @
Nemanja
HVALA PUNO nadam se da cu dokraja sve uspesno uraditi.
Kazes da mozda user/pass nije dobar ali sa istim user/pass se ulazi na aplikaciju sa ucitavanje skeniranih dokumanta ?
[ caca1 @ 08.03.2020. 07:35 ] @
Nemanja
kada sam input ubacila u fajl da vidim kako izgleda, sva definisana polja sa velikim slovima nisu na onoj poziciji kako su definisana u klasi ugovor.
Kada sa peto polje (MB) stavila da je sa malim slovima onda je bilo na pravom mestu. Kakvo je ovo ludilo totalno sam pobrljavila.
A server salje odgovor code 1 "Nepostojeci korisnik"

[Ovu poruku je menjao caca1 dana 08.03.2020. u 09:34 GMT+1]
[ nemnesic @ 08.03.2020. 14:33 ] @
Red polja u json payload nije bitan.
[ Java Beograd @ 08.03.2020. 16:35 ] @
Nepostojeci korisnik je sasvim OK response.
To znači da je request primljen, testiran, i izvršen.

Atributi za korisničke kredencijale su prihvaćeni, i procesirani. Šta više?

E sad, jbg, takvog korisnika nema u bazi.
[ caca1 @ 08.03.2020. 20:27 ] @
Pa to je super, znaci sve ce da proraditi samo dobavljaca da ubace u bazu. Stvarno lepe vesti, redosled polja u json nije vazan a ja sam bila ocajna kada sam videla fajl.
HVALA Nemanji i JavaBeograd na strljenju i napisacu sta se dalje desavalo.
[ caca1 @ 10.03.2020. 16:43 ] @
Jos nema odgovora iz RFZo na poruku "nepostojeci korisnik".
Slala sam i sliku iz postman, inputa i response, jer su tako trazili, na email itpitanja.rfzo.rs a i dalje nema odgovora.
[ bokinet @ 10.03.2020. 17:44 ] @
SEKTOR ZA RAZVOJ I INFORMACIONE TEHNOLOGIJE
011/2053-706
[ caca1 @ 11.03.2020. 07:30 ] @
bokinet
sada sam zvala taj telefon i kazu da moramo da pisemo mejl za bilo kakava problem ili pitanje.
[ caca1 @ 11.03.2020. 15:33 ] @
Dobila sam sada informaciju da idZu mora da ima vodecu nulu da bi idZu imao 8 cifara (MB).
Preko posmena kada sam ubacila 0 u idZu javio je gresku "Neispravan broj elemenata u JSON zahtevu".
Kada sam idZu stavila pod znacima navoda onda je poruka
"response": {
"code": "3",
"msg": "Ugovor je uspesno sacuvan",
"idUpisRFZO": "0"
Tako da sam idZu prebacila na String a ne int kako je pisalo u tehn. dokumentaciji.
[ nemnesic @ 11.03.2020. 15:50 ] @
Bravo za RFZ programere!
[ caca1 @ 16.03.2020. 11:17 ] @
U ovom slucaju,
važno je da redosled polja u inputu (json) bude isti kao u teh. dokumentaciji kao i velika i mala slova u nazivu polja (kljuc).
[ DraganR1 @ 11.01.2022. 20:29 ] @

[/quote]
Znam da je prošlo dostav vremena od ove teme. Trenutno, naš programer ima isti problem, na kraju dobije isti odgovor "nepostojeći korisnik". Od RFZO, nismo dobili odgovor na upit, gde grešimo. Da li ste vi rešili problem?
[ caca1 @ 12.01.2022. 12:42 ] @
Da rešila sam u martu 2020.god kada je radjen klijent program u javi i to radi i danas.
Sve sam i na ovom forumu prenela.
1. Prvo idZU stavite da nije int već String polje. idZu mora da ima vodecu nulu da bi idZu imao 8 cifara (MB).
2. Važno je da redosled polja u inputu (json) bude isti kao u teh. dokumentaciji kao i velika i mala slova u nazivu polja (kljuc).

deo koda
.................
URL url = new URL(
"https://ws.rfzo.rs/Fin/ObavezeMatUpis");
HttpURLConnection
conn =
(HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);//
conn.setRequestProperty("Content-Type",
"application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestMethod("POST");
..............
ObjectMapper mapper = new ObjectMapper();

SimpleModule s = new SimpleModule();
s.addSerializer(RacunR.class, new RacunRSerializer()); //!!!!
mapper.registerModule(s);

RacunR u = new RacunR();

u.setIdZu("12345678");
u.setUser("xxxxx");
u.setPass("xx");
.......
String input = mapper.writeValueAsString(u);

//---zahtev serveru---------------
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
os.close();
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}


Mislim da sam vam sve prenela i nadam se da ce vam ovo pomoci.
Pozdrav
[ DraganR1 @ 13.01.2022. 08:52 ] @
Hvala Vam puno,

javiću rezulat
[ DraganR1 @ 18.01.2022. 08:53 ] @
Za cacu1

Poštovana, pokušavam da ne narušim pravila ovog foruma. Na ovu temu sam došao u cilju rešavanja poslovnog problema. Još uvek ne mogu da šaljem PP i mail.

Molim Vas da mi se javie na mail u cilju poslovnog dogovora.

Unapred se izvinjavam moderatorima ako ovaj poziv nije dozvoljen
[ mjanjic @ 20.01.2022. 16:14 ] @
Uglavnom je jedna od osnovnih stvari da se brojevi koji počinju nulama tretiraju kao string, npr. JMBG može počinjati nulom i preporuka je da se za njega koristi string kao tip podatka, jer se nikad ne zna koji servis ili deo aplikacije može zanemariti te nule i onda eto problema.

A taj koji je sastavljao dokumentaciju je neki duduk koji ne razmišlja o takvim stvarima.
[ caca1 @ 04.03.2023. 16:16 ] @
Kolege
treba mi neka sugestija za resavanje problema kod upload fajla preko REST post na web servis.

Odgovor web servisa je status code 422 {"status":"failed","error":{"data":["Parametar data je obavezan"],..............

Fajl sam za probu ucitala preko Swagger UI i dobila sledeci rezultat (tackice zamenjuju prave podatke kao name i email)

curl -X 'POST' \
'https://............/send/file/xml' \
-H 'accept: application/json' \
-H 'authorization-general: Bearer 36...........' \
-H 'Authorization: Bearer ey...........' \
-H 'Content-Type: multipart/form-data' \
-F '[email protected];type=text/xml' \
-F 'type=0' \
-F 'contacts[0][name]=aaaaaa' \
-F 'contacts[0][email][email protected]' \

na osnovu toga sam napisala clijent program
**************************************************
........
CloseableHttpClient httpclient = null;
String boundary;
try {
boundary = "--" + System.currentTimeMillis();
InputStream responseStream;
BufferedReader br;

String url = "https://.........../send/file/xml";
File file = new File("e:/............../012023IV260.xml");
HttpPost post = new HttpPost(url);
post.addHeader("accept", "application/json");
post.addHeader("authorization-general", "Bearer 36.............");
post.addHeader("Authorization", "Bearer ey..............");
post.addHeader("Content-Type","multipart/form-data; boundary="+ boundary);

MultipartEntityBuilder builder = MultipartEntityBuilder.create();

builder.addBinaryBody("data", file,ContentType.TEXT_XML, file.getName());
builder.setBoundary(boundary);

builder.addTextBody("type", "0");
builder.setBoundary(boundary);

builder.addTextBody("contacts[0][name]","aaaaa");
builder.setBoundary(boundary);

builder.addTextBody("contacts[0][email]","[email protected]");

builder.setBoundary(boundary+"--");


httpclient = HttpClientBuilder.create().build();
HttpEntity entity = builder.build();
post.setEntity(entity);

HttpResponse response = httpclient.execute(post);

if (response != null) {
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status code: " + statusCode);

HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {

responseStream = responseEntity.getContent() ;
if (responseStream != null){

br = new BufferedReader (new InputStreamReader (responseStream)) ;

String responseLine = br.readLine() ;
String tempResponseString = "" ;
while (responseLine != null){
tempResponseString = tempResponseString + responseLine + System.getProperty("line.separator") ;
responseLine = br.readLine() ;
}
br.close() ;
if (tempResponseString.length() > 0){
System.out.println(tempResponseString);
}
}
responseStream.close();
}
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
httpclient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
*************************************
Hvala unapred za bilo kakvu sugestiju