#java #httpurlconnection
#java #httpurlconnection
Вопрос:
Я написал простой сервлет, который принимает запросы HTTP POST и отправляет короткий ответ. Вот код для сервлета:
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.*;
/**
* Servlet implementation class MapleTAServlet
*/
@WebServlet(description = "Receives XML request text containing grade data and returns response in XML", urlPatterns = { "/MapleTAServlet" })
public class MapleTAServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Log log = LogFactory.getLog(MapleTAServlet.class);
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String strXMLResponse = "<Response><code>";
String strMessage = "";
int intCode = 0;
ServletOutputStream stream = null;
BufferedInputStream buffer = null;
try
{
String strContentType = request.getContentType();
// Make sure that the incoming request is XML data, otherwise throw up a red flag
if (strContentType != "text/xml")
{
strMessage = "Incorrect MIME type";
}
else
{
intCode = 1;
} // end if
strXMLResponse = intCode "</code><message>" strMessage "</message></Response>";
response.setContentType("text/xml");
response.setContentLength(strXMLResponse.length());
int intReadBytes = 0;
stream = response.getOutputStream();
// Converts the XML string to an input stream of a byte array
ByteArrayInputStream bs = new ByteArrayInputStream(strXMLResponse.getBytes());
buffer = new BufferedInputStream(bs);
while ((intReadBytes = buffer.read()) != -1)
{
stream.write(intReadBytes);
} // end while
}
catch (IOException e)
{
log.error(e.getMessage());
}
catch (Exception e)
{
log.error(e.getMessage());
}
finally
{
stream.close();
buffer.close();
} // end try-catch
}
}
И вот клиент, который я использую для отправки запроса:
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.*;
public class TestClient
{
/**
* @param args
*/
public static void main(String[] args)
{
BufferedReader inStream = null;
try
{
// Connect to servlet
URL url = new URL("http://localhost/mapleta/mtaservlet");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Initialize the connection
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setUseCaches(false);
conn.setRequestProperty("Content-Type", "text/xml");
//conn.setRequestProperty("Connection", "Keep-Alive");
conn.connect();
OutputStream out = conn.getOutputStream();
inStream = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String strXMLRequest = "<?xml version="1.0" encoding="UTF-8"?><Request></Request>";
out.write(strXMLRequest.getBytes());
out.flush();
out.close();
String strServerResponse = "";
System.out.println("Server says: ");
while ((strServerResponse = inStream.readLine()) != null)
{
System.out.println(strServerResponse);
} // end while
inStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
} // end try catch
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что при запуске клиентской программы я получаю следующий вывод:
Server says:
<Response><code>0</code><message>Incorrect MIME type</message></Response>
Я попытался вызвать request.getContentType() и получил «текст / xml» в качестве вывода. Просто пытаюсь выяснить, почему строка не совпадает.
Ответ №1:
Вы неправильно сравниваете строки.
if (strContentType != "text/xml")
Строки не являются примитивами, они являются объектами. При использовании !=
для сравнения двух объектов он будет проверять, только если они не указывают на одну и ту же ссылку. Однако вас скорее интересует сравнение содержимого двух разных строковых ссылок, а не если они указывают на одну и ту же ссылку.
Затем вы должны использовать equals()
метод для этого:
if (!strContentType.equals("text/xml"))
Или, лучше, избегать NullPointerException
, если Content-Type
заголовок отсутствует (и, следовательно, становится null
):
if (!"text/xml".equals(strContentType))
Комментарии:
1. является ли это правильным способом определения contenttype запроса HttpServletRequest? Я не очень доволен этим, потому что, когда вы ищете точные совпадения строк, «text / xml» отличается от «text / xml; charset = UTF-8» и отличается от «text / xml; charset = UTF-8» и отличается от «application / xml». итак, есть ли способ чисто просто отличать, например, запросы xml от запросов формы? таким образом, не покрывая вручную все разновидности строк, которые могут представлять разные типы запросов
2. Я получил нарушение приведения в моем методе doPost за то, что он не вызывал метод getContentType внутри … могу ли я использовать его просто по-своему try { String msg=»»; String strContentType = req.getContentType(); if (!»text / xml».equals(strContentType)) msg=»Недопустимый MIME-тип»; }catch(исключение e) { e.printStackTrace(); }
3. как он ведет себя, если getContentType возвращает null