2012-04-04 4 views
0

클래스 용으로 약간의 API를 구축 중이며 선생님이 Runnable을 구현하는 간단한 웹 서버를 제공하는 자습서에 대한 링크를 제공했습니다.특정 요청에 대해서만 코드 실행 Java

나는 인수 (또는 적어도 요청 문자열을 얻는다)와 간단한 xml을 반환 할 일부 코드를 구문 분석 할 일부 코드를 이미 작성했습니다.

그러나 favicon에 대한 요청과 같은 특정 요청은 내 코드가 엉망이라고 생각합니다. 나는 그것을 다른 곳에 포장했지만 작동하지 않는 것 같습니다. 때문에 기본 문자열 비교 오류의 수정 됨

=====은 =====

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(); 
    } 
} 
} 

콘솔 출력은 내가 항상뿐만 아니라 XML을 반환

GET /?format=json HTTP/1.1 
I am Here 
format=json 
json 
format: xml 

를 얻을.

이것은 웹 서버를 작성하고 Java 네트워킹을 다루는 데 처음 접했을 때 일반적으로 많이 좌절 시켰습니다. 따라서 제안 사항은 매우 만족 스럽습니다.

다른 사람들로부터 조금만 도움을 받으면이 부분이됩니다. if(format.equals("xml")) 조건 블록도 request 있는지 확인 : 그것은 당신이 대신 ==

equals를 사용하는 데 필요한 모든 you'r 문자열 비교를 위해

   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]; 
       } 

답변

5

일치하지 그래서 나는 문자열의 잘못된 부분을 비교했다 null입니다

if (request != null && !"GET /favicon.ico HTTP/1.1".equals(request) 
    && !"GET/HTTP/1.1".equals(request) && !"".equals(request)) 
3

Java를 사용하고 있습니까? 자바에서 당신은 당신이

!"GET /favicon.ico HTTP/1.1".equals(request) 
1

서버가 메시지를 보낼 때까지 당신은 루프에서 기다려야를 작성해야 이런 식으로

request != "GET /favicon.ico HTTP/1.1" 

에서 문자열을 비교할 수 없습니다. 소켓에서 읽을 때 시도해보십시오.

String request; 
    while((request=in.readLine())==null); 
    System.out.println(request); 
관련 문제