ورود

View Full Version : مشکل POST داده فارسی در وب سرویسی که با Jersey پیاده شده.



MSHService
شنبه 22 فروردین 1394, 07:01 صبح
با درود و ادب

دوستان من در حال نوشتن یه برنامه با جرسی و هایبرنیتم که داده ها را بگیره و با دیتابیس کارهایی روشون انجام بده و پاسخ رو برگردونه.

خب حالا مشکل من اینجاست وقتی من داده های را در کروم با add on اون که POSTMAN هست ، ارسال می کنم سرور نمیتونه داده فارسی رو بفهمه!

ممنون میشم بتونید راهنماییم کنید.

با سپاس

این متد تستم در Junit

@Test public void testSearchObject(){

BranchLocationSearchClient client = new BranchLocationSearchClient();

List<String> searchValues = new ArrayList<String>();

searchValues.add("سازمان جهاد");

BranchLocationSearch search = new BranchLocationSearch();

search.setBranchNames(searchValues);

search.setBranchCodeFrom(2016);
search.setBranchCodeTo(2077);

search.setSearchType(EnumBranchLocationSearchType. SEARCH_BY_BRANCH_CODE);


List<BranchLocation> branchLocations = client.searchByObject(search);

System.err.println("testSearchObject->branchLocations: "+branchLocations);

}

اینم متد کلاینتم :
public List<BranchLocation> searchByObject(BranchLocationSearch search) { URI uri = UriBuilder.fromUri(link)
.path("search/locations")
.build();
WebTarget target = client.target(uri);
Response response = target.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(search, MediaType.APPLICATION_JSON));

if(response.getStatus()!=200){
throw new RuntimeException(response.getStatus()+getClass().g etName()+": There is an error on server!");
}
return response.readEntity(new GenericType<List<BranchLocation>>(){});

}

اینم متد Resourceم

@POST
@Consumes(MediaType.APPLICATION_JSON)//";charset=utf-8"
@Produces({MediaType.APPLICATION_JSON,MediaType.AP PLICATION_XML})
public Response searchFroBranch(BranchLocationSearch search) throws Exception{
//http://localhost:8080/exercise-services/webapi/search/locations/
System.err.println(getClass().getSimpleName()+"->"+"searchFroBranch: "+search);

List<BranchLocation> branchLocationes = branchLocationDAO.findByConstraints(search);

if(branchLocationes==null || branchLocationes.size()<1){
return Response.status(Status.NOT_FOUND).entity("!ERROR NOT FOUND IN DB").build();
}
return Response.ok().entity(new GenericEntity<List<BranchLocation>>(branchLocationes){} ).build();

}

omidbizdotcom
شنبه 22 فروردین 1394, 09:14 صبح
تا جایی که من میبینم این کد ۱۰۰ درصد درسته یکبار با Poster که addon firefox هم تست کن اگر مشکل داست تنظیمات دیتا بیس مورد داره از mysql استفاده می کنی ؟

ahmad.mo74
شنبه 22 فروردین 1394, 10:35 صبح
سلام

راه های زیادی هست.
یکیش اینه :


@Produces("application/json;charset=UTF-8")


اون جاییم که درخواست رو میفرستی ;charset=UTF-8 رو به آخرش اضافه کن.

اگر بازم نشد، توی header های درخواست هم Content-Type رو روی "application/json;charset=UTF-8" بزار.

اگه بازم نشد :)) میشه اطلاعات رو موقع فرستادن درخواست encode کنی و سمت سرور دوباره decode اش کنی. از کلاسای Base64 یا URLEncoder و URLDecoder میتونی استفاده کنی (همشون تو خود jdk هست)
خود json رو به هیچ وجه encode نکن، فقط اطلاعاتش رو. یعنی مثلا :


searchValues.add(URLEncoder.encode("سازمان جهاد", "UTF-8"));


و سمت سرور هم موقعی که داری اطلاعات رو از BranchLocationSearch میخونی به این صورت decode کنی :


URLDecoder.decode(string, "UTF-8");


در کل JAX-RS اخیرا بای دیفالت خودش utf-8 تولید میکنه، اگر از آخرین ورژن jersey هم استفاده کنی بد نیست.

و اینکه این تستت احتمالا مشکل داره، باید انکدینگ ide ات رو هم بزاری رو utf-8 تا اونجایی که فارسی نوشتی رو درست encode کنه.

MSHService
شنبه 22 فروردین 1394, 16:48 عصر
متشکرم از پاسختون
ولی من همه کارها رو کردم اما نشد!!

سرورم :


@POST @Path("create")
@Consumes(MediaType.APPLICATION_JSON)
// @Produces({ MediaType.APPLICATION_JSON+";charset=utf-8", MediaType.APPLICATION_XML +";charset=utf-8"})
@Produces({ MediaType.APPLICATION_JSON+";charset=utf-8"})
public Response createBranchLocation(BranchLocation branchLocation)
throws Exception {
System.err.println("********POST createBranchLocation: " + branchLocation);
BranchLocation bl = branchLocationDao.createBranchLocation(branchLocat ion);
if (bl == null) {//
return Response
.status(Response.Status.CONFLICT)
.entity("ERROR! THIS BRANCH (with Code: "
+ branchLocation.getBranchMgCode()
+ ", BranchName: "
+ branchLocation.getBranchName()
+ ") IS EXIST!").build();
}


return Response.ok().entity(bl).build();
}
کلایمتم که موبایل هست
final String link = "http://" + serverIp + ":8080/exercise-services/webapi/locations/create";
BranchLocation bl = new BranchLocation();
try {
bl.setBranchName(URLDecoder.decode("مهدی تست", "UTF-8"));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
bl.setBranchMgCode(3600);

Gson gson = new Gson();
String jsonString = gson.toJson(bl);
try {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(link);
httppost.setEntity(new StringEntity(jsonString));
httppost.setHeader("Accept", "application/json; ;charset=utf-8");
httppost.setHeader("Content-type", "application/json ;charset=utf-8");
HttpResponse response = httpClient.execute(httppost);
System.err.println("response: "+response.toString());
HttpEntity entity = response.getEntity();

String text = getASCIIContentFromEntity(entity);
System.err.println("Post-> response: " + text);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}

یه نکته دیگه با Poster که addon فایرفاکسه به درستی کار میکنه ! اما نمیدونم دیگه چرا نمیتونم!

ahmad.mo74
شنبه 22 فروردین 1394, 21:25 عصر
خب پس راهش همون encode/decode ه

در ضمن تو خط 4 به جای decode باید encode بشه و بعد توی سرور decode بشه. یعنی :

سمت کلاینت :

BranchLocation branchLocation = new BranchLocation();
branchLocation.setBranchName(URLEncoder.encode("مهدی تست", "UTF-8"));


و سمت سرور :


@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public Response createBranchLocation(BranchLocation branchLocation) throws Exception {
//...
String branchName = URLDecoder.decode(branchLocation.getBranchName(), "UTF-8");
//...
}


این روش قطعا باید درست کار کنه.