我正在为课程构建一个小API,老师为我们提供了一个指向教程的链接,该教程提供了一个实现Runnable的简单Web服务器。
我已经编写了一些代码来解析参数的参数(或者至少让我得到请求字符串)和一些会返回一些简单xml的代码。
然而,我认为像favicon这样的某些请求被发送了,我认为这会弄乱我的代码。我把它包裹在一个if else中,但它似乎没有用。
=====已编辑由于基本字符串比较错误=====
package server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.*;
import java.io.*;
import java.net.*;
import parkinglots.*;
/**
import our API
*/
public class WorkerRunnable implements Runnable{
protected Socket clientSocket = null;
protected String serverText = null;
public WorkerRunnable(Socket clientSocket, String serverText) {
this.clientSocket = clientSocket;
this.serverText = serverText;
}
public Boolean authenticateAPI(String key){
//Authenticate Key against Stored Keys
//TODO: Create Stored Keys and Compare
return true;
}
public void run() {
try {
InputStream input = clientSocket.getInputStream();
OutputStream output = clientSocket.getOutputStream();
long time = System.currentTimeMillis();
//TODO: Parse args and output different formats and Authentication
//Parse URL Arguments
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream(), "8859_1"));
String request = in.readLine();
//Server gets Favicon Request so skip that and goto args
System.out.println(request);
if ( !"GET /favicon.ico HTTP/1.1".equals(request) && !"GET / HTTP/1.1".equals(request) && !"".equals(request) ){
String format = "", apikey ="";
System.out.println("I am Here");
String request_location = request.split(" ")[1];
String request_args = request_location.replace("/","");
request_args = request_args.replace("?","");
String[] queries = request_args.split("&");
System.out.println(queries[0]);
for ( int i = 0; i < queries.length; i++ ){
if( queries[i].equals("format") ){
format = queries[i].split("=")[1];
}
else if( queries[i].equals("apikey") ){
apikey = queries[i].split("=")[1];
}
}
if( apikey.equals("") ){
apikey = "None";
}
if( format.equals("") ){
format = "xml";
}
System.out.println("format: "+format);
Boolean auth = authenticateAPI(apikey);
if ( auth ){
if ( format.equals("xml")){
// Retrieve XML Document
String xml = LotFromDB.getParkingLotXML();
output.write((xml).getBytes());
}else{
//Retrieve JSON
String json = LotFromDB.getParkingLotJSON();
output.write((json).getBytes());
}
}else{
output.write(("Access Denied - User is Not Authenticated").getBytes());
}
}else{
output.write(("Access Denied Must Pass API Key").getBytes());
}
output.close();
input.close();
System.out.println("Request processed: " + time);
} catch (IOException e) {
//report exceptions
e.printStackTrace();
}
}
}
控制台输出我
GET /?format=json HTTP/1.1
I am Here
format=json
json
format: xml
它总是返回XML。
这是我第一次尝试编写Web服务器并处理Java中的网络,这让我很沮丧,所以这里的任何建议都非常感激。
在得到其他人的帮助后,原来是这里的一部分。我正在比较字符串的错误部分,因此它永远不会匹配
if( queries[i].split("=")[0].equals("format") ){
format = queries[i].split("=")[1];
}
else if( queries[i].split("=")[0].equals("apikey") ){
apikey = queries[i].split("=")[1];
}
答案 0 :(得分:5)
对于所有字符串比较,您需要使用equals
而不是==
示例:条件块中的if( format.equals("xml"))
也检查request
是否为空
if (request != null && !"GET /favicon.ico HTTP/1.1".equals(request)
&& !"GET / HTTP/1.1".equals(request) && !"".equals(request) )
答案 1 :(得分:3)
但你使用的是Java? 在java中,你无法以这种方式比较String
request != "GET /favicon.ico HTTP/1.1"
你需要写
!"GET /favicon.ico HTTP/1.1".equals(request)
答案 2 :(得分:1)
您应该在循环中等待,直到服务器发送消息。从socket读取时尝试这个:
String request;
while((request=in.readLine())==null);
System.out.println(request);