Java 通过restletapi调用restfulws
我试图从我的客户机代码(基于Restlet)调用WS,但在client.post方法上收到一个错误的请求异常(HTTP状态代码400)Java 通过restletapi调用restfulws,java,web-services,restlet,Java,Web Services,Restlet,我试图从我的客户机代码(基于Restlet)调用WS,但在client.post方法上收到一个错误的请求异常(HTTP状态代码400) public static void main(String[] args) throws Exception{ String serviceUrl = "http://localhost:8080/MPosBEService"+BeServicePath.MERCHANT_REGISTRATION; //String serviceUrl =
public static void main(String[] args) throws Exception{
String serviceUrl = "http://localhost:8080/MPosBEService"+BeServicePath.MERCHANT_REGISTRATION;
//String serviceUrl = "http://192.168.101.124:8081/be"+BeServicePath.MERCHANT_REGISTRATION;
ClientResource client = new ClientResource( serviceUrl );
addHeaders( client );
objectMapper=new ObjectMapper();
objectMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
try{
Form form = new Form();
form.set("username", "intendanet");
form.set("password", "1111");
client.post( form, MediaType.APPLICATION_JSON );//**this line is the culprit**
//client.post(new MerchantRegisterRequestPojo("intendanet","1111"), MediaType.APPLICATION_JSON );
}catch(Exception e)
{
System.out.println(e.getLocalizedMessage());
throw e;
}
Response response = client.getResponse();
if( response.getStatus().getCode() == 200 )
{
m = deserializeJson( (HttpEntity)response.getEntity(), MerchantPojo.class );
System.out.println("Result:" + m.id);
}else {
System.out.println("Exception: "+ response.getStatus().getCode());
throw new HttpStatusException(response.getStatus().getCode());
}
}
static private void addHeaders(ClientResource client){
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_LANGUAGE_ID.toString(), "1"+"");
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_APP_VERSION.toString(), "1"+"");
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_GENERATED_ID.toString(), "flskdjf9ksmflskmfl");
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_INFO.toString(), "ovo je moj device!");
}
static private <T> T deserializeJson(HttpEntity json, Class<T> targetType) throws Exception{
return objectMapper.readValue(EntityUtils.toString(json), targetType);
}
publicstaticvoidmain(字符串[]args)引发异常{
字符串serviceUrl=”http://localhost:8080/MPosBEService“+BeServicePath.MERCHANT_注册;
//字符串serviceUrl=”http://192.168.101.124:8081/be“+BeServicePath.MERCHANT_注册;
ClientResource客户端=新的ClientResource(serviceUrl);
addHeaders(客户端);
objectMapper=新的objectMapper();
objectMapper.configure(Feature.FAIL_ON_UNKNOWN_属性,false);
configure(SerializationConfig.Feature.FAIL\u在\u空\u bean上,false);
试一试{
表单=新表单();
表格集(“用户名”、“意向网”);
表格设置(“密码”、“1111”);
client.post(form,MediaType.APPLICATION_JSON);//**这一行是罪魁祸首**
//client.post(new-MerchantRegisterRequestPojo(“intendanet”,“1111”),MediaType.APPLICATION_JSON);
}捕获(例外e)
{
System.out.println(e.getLocalizedMessage());
投掷e;
}
Response=client.getResponse();
if(response.getStatus().getCode()==200)
{
m=反序列化JSON((HttpEntity)response.getEntity(),MerchantPojo.class);
System.out.println(“结果:+m.id”);
}否则{
System.out.println(“异常:+response.getStatus().getCode());
抛出新的HttpStatusException(response.getStatus().getCode());
}
}
静态私有void addHeaders(ClientResource客户端){
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u LANGUAGE\u ID.toString(),“1”+”);
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u DEVICE\u APP\u VERSION.toString(),“1”+”);
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u DEVICE\u GENERATED\u ID.toString(),“flskdjf9ksmflskmfl”);
client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u DEVICE\u INFO.toString(),“ovo je moj DEVICE!”);
}
静态私有T反序列化json(HttpEntity json,类targetType)引发异常{
返回objectMapper.readValue(EntityUtils.toString(json),targetType);
}
谢谢我不知道您的REST服务期望什么,但我发现您的代码中存在两个潜在问题 首先,您的响应中没有正确设置标题。您应该更新方法
addHeaders
,如下所述:
static private void addHeaders(ClientResource client){
Series<Header> headers = (Series<Header>) cr.getRequestAttributes().get(
"org.restlet.http.headers");
if (headers==null) {
headers = new Series<Header>(Header.class);
cr.getRequestAttributes().put(
"org.restlet.http.headers", headers);
}
headers.set(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_LANGUAGE_ID.toString(), "1");
headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_APP_VERSION.toString(), "1");
headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_GENERATED_ID.to String(), "flskdjf9ksmflskmfl");
headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_INFO.toString(), "ovo je moj device!");
}
希望有帮助,
Thierry告诉我们有关服务器的更多信息。它需要什么样的请求?BeServicePath.MERCHANT\u注册的内容是什么?可能您错过了一个
/
?服务器是运行在192.168.101.124(远程服务器)或本地主机上的Tomcat。我尝试了两个url,但得到了相同的异常。它希望收到一个应用程序/x-www-form-urlencoded mime type.BeServicePath.MERCHANT\u注册被定义为/MERCHANT/register,所以我认为url是可以的。但是您的请求mime类型是application/json,为什么不试试这个:client.post(form,MediaType.APPLICATION\u form\u URLENCODED);
谢谢您的建议,但它仍然不起作用。首先,我必须使用MediaType.APPLICATION\u WWW\u form(MediaType.APPLICATION\u form\u URLENCODED无法编译)第二,Restlet文档说post方法的第二个参数表示响应mime类型,而不是请求类型,我的响应mime应该是application/json和request-application/www-form(尽管此异常是从org.restlet.resource.ServerResource.doHandle(ServerResource.java:517)中的NPE映射而来的,但感谢您提供有关您的问题的其他提示!我们可以给我您使用的restlet版本吗?这样我就可以进行更多测试来重现您的问题;-)蒂埃里,谢谢你的帮助。现在,在localhost上,我得到了204状态(无内容)因此,标题现在很好。我使用org.apache.httpapi重写了整个代码,它工作正常。我得到了预期的json响应。我会在找到时间后对restlet代码进行更多测试。很高兴听到这一点!方法post
的第二个参数是正确的。它实际上对应于标题的内容接受
并指定预期的响应格式。
// With form
Form form = new Form();
form.set("username", "intendanet");
form.set("password", "1111");
client.post(form, MediaType.APPLICATION_FORM_URLENCODED);
// With JSON
JSONObject jsonObj = new JSONObject
jsonObj.put("username", "intendanet");
jsonObj.put("password", "1111");
client.post(new JsonRepresentation(jsonObj));