首先,是的,在这个确切的前提下,SO上存在多个问题。但是没有一个答案对我有用,所以我会问我的具体问题。
我有一个本地运行的web服务。此Web服务有一个允许您尝试登录的方法。如果成功,它会返回用户信息。如果您没有,则会收到无效的用户对象。
@Path("/UserService")
public class UserService {
Dao dao = new Dao();
@POST
@Consumes(MediaType.APPLICATION_XML)
@Path("/login")
@Produces(MediaType.APPLICATION_XML)
public User login(final LoginBean params){
//return new User();
User u = new User();
u.setEmail(params.email);
u.setPassword(params.password);
return dao.login(u);
}
}
这种特定的方法在Postman中运行良好。我称之为,获得200响应,并将完整的用户对象作为xml。
但是当我从我的代码中调用它时,它会在行conn.getInputStream()上抛出一个FileNotFoundException;
public class UserDAO {
public static User login(User user) {
String uri = "http://192.168.2.22:8080/Roommanagement/rest/UserService/login";
try {
URL url = new URL(uri);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
//conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty( "Content-Type", "application/xml");
//conn.setRequestProperty( "charset", "utf-8");
//conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
conn.setUseCaches( false );
JAXBContext jc = JAXBContext.newInstance(User.class);
jc.createMarshaller().marshal(user, conn.getOutputStream());
//XMLEncoder xmlE = new XMLEncoder(conn.getOutputStream());
//xmlE.writeObject(user);
//xmlE.close();
JAXBContext jc = JAXBContext.newInstance(User.class);
java.io.InputStream streamXML;
streamXML = conn.getInputStream();
User returnedUser =
(User) jc.createUnmarshaller().unmarshal(streamXML);
conn.disconnect();
return returnedUser;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new User();
}
}
你可以从注释掉的行中看到我尝试过的一些事情,但没有一件事有所不同。
我做错了什么?我认为服务本身很好,因为从Postman完成的所有手动调用都按预期工作。
答案 0 :(得分:2)
我在这看到一个潜在的问题:
您的操作不包括LoginBean
实例,但您提供了User
实例:
public User login(final LoginBean params){
和
public static User login(User user) {
....
jc.createMarshaller().marshal(user, conn.getOutputStream());
答案 1 :(得分:1)
很多事情都可能发生。
您要做的第一件事就是获取响应代码并对其进行测试。
con.getResponseCode();
在尝试转换为XML之前获取内容类型是一种很好的做法。只需用普通字符串打印即可。
根据收到的回复代码处理回复。这里有一些代码可以作为示例使用。
if ((200 <= con.getResponseCode() && con.getResponseCode() <= 299)) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((con.getInputStream())));
String response = new String();
for (String line; (line = bufferedReader.readLine()) != null; response += line);
System.out.println(response);
} else {
System.out.println();
Map<String, List<String>> map = con.getHeaderFields();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
if (entry.getKey() == null) {
System.out.println(entry.getValue());
} else {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
System.out.println();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((con.getErrorStream())));
String response = new String();
for (String line; (line = bufferedReader.readLine()) != null; response += line);
System.out.println(response);
throw new WebServiceException(response);
}
}
答案 2 :(得分:0)
我认为您缺少发出实际HTTP请求的代码。您需要调用connect方法来发出实际请求。
conn.connect()
其余的代码看起来很好。