0

こんにちは、迅速なクライアントから Java サーバーで簡単な認証を実行しようとしています。Java サーバーは HTTPServer であり、そのコードはユーザー名とパスワードを含む「POST」要求を受け取ります。サーバーは、ユーザー名とパスワードが正しい場合は true を返し、JSON データを介していない場合は false を返します。

問題は迅速なクライアントにあると私は信じています。タスクの完了コードを実行していないように見えるため、実際にサーバーに接続して localhost で実行できるとは思えません。クライアント コードとサーバー コードの両方を以下に示します。完了コードが実行されない理由を教えてください。そして、それを修正する方法についての答えを教えてください。

スウィフト クライアント:

import Foundation

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: configuration)
    let usr = "TBecker"
    let pwdCode = "TBecker"
    let params:[String: AnyObject] = [
        "User" : usr,
        "Pass" : pwdCode ]

    let url = NSURL(string:"http://localhost:8080/auth")
    let request = NSMutableURLRequest(URL: url)
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.HTTPMethod = "POST"

    if (NSJSONSerialization.isValidJSONObject(params)) {
            do {
                    request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.PrettyPrinted)
            } catch {
                    print("catch failed")
            }
    }

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error in

            if let httpResponse = response as? NSHTTPURLResponse {
                    if httpResponse.statusCode != 200 {
                            print("response was not 200: \(response)")
                            return
                    }
            }
            if (error != nil) {
                    print("error submitting request: \(error)")
                    return
            }

            // handle the data of the successful response here
            if (NSJSONSerialization.isValidJSONObject(data!)) {
                    do {
                            print("received data of some sort")
                            let result = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
                            print(result)
                    } catch {
                            print("catch failed")
                    }
            }
    })

    task.resume()

Java サーバー:

    public class HTTPRequestHandler {
    private static final String HOSTNAME = "localhost";
    private static final int PORT = 8080;
    private static final int BACKLOG = 1;

    private static final String HEADER_ALLOW = "Allow";
    private static final String HEADER_CONTENT_TYPE = "Content-Type";

    private static final Charset CHARSET = StandardCharsets.UTF_8;

    private static final int STATUS_OK = 200;
    private static final int STATUS_METHOD_NOT_ALLOWED = 405;

    private static final int NO_RESPONSE_LENGTH = -1;

    private static final String METHOD_POST = "POST";
    private static final String METHOD_OPTIONS = "OPTIONS";
    private static final String ALLOWED_METHODS = METHOD_POST + "," + METHOD_OPTIONS;

    public static void main(final String... args) throws IOException {
        final HttpServer server = HttpServer.create(new InetSocketAddress(HOSTNAME, PORT), BACKLOG);
        server.createContext("/auth", he -> {
            try {
                System.out.println("Request currently being handled");
                final Headers headers = he.getResponseHeaders();
                final String requestMethod = he.getRequestMethod().toUpperCase();
                switch (requestMethod) {
                    case METHOD_POST:
                        final Map<String, List<String>> requestParameters = getRequestParameters(he.getRequestURI());
                        // do something with the request parameters
                        final String success;

                        if (requestParameters.containsKey("User") && requestParameters.containsKey("Pass"))
                            if (requestParameters.get("User").equals("TBecker") && requestParameters.get("Pass").equals("TBecker")) {
                                    success = "['true']";
                            } else {
                                success = "['false']";
                            }
                        else
                            success = "['false']";
                        headers.set(HEADER_CONTENT_TYPE, String.format("application/json; charset=%s", CHARSET));
                        final byte[] rawSuccess = success.getBytes(CHARSET);
                        he.sendResponseHeaders(STATUS_OK, rawSuccess.length);
                        he.getResponseBody().write(rawSuccess);
                        break;
                    default:
                        headers.set(HEADER_ALLOW, ALLOWED_METHODS);
                        he.sendResponseHeaders(STATUS_METHOD_NOT_ALLOWED, NO_RESPONSE_LENGTH);
                        break;
                }
            } finally {
                System.out.println("request successfully handled");
                he.close();
            }
        });
        server.start();
    }

    private static Map<String, List<String>> getRequestParameters(final URI requestUri) {
        final Map<String, List<String>> requestParameters = new LinkedHashMap<>();
        final String requestQuery = requestUri.getRawQuery();
        if (requestQuery != null) {
            final String[] rawRequestParameters = requestQuery.split("[&;]", -1);
            for (final String rawRequestParameter : rawRequestParameters) {
                final String[] requestParameter = rawRequestParameter.split("=", 2);
                final String requestParameterName = decodeUrlComponent(requestParameter[0]);
                requestParameters.putIfAbsent(requestParameterName, new ArrayList<>());
                final String requestParameterValue = requestParameter.length > 1 ? decodeUrlComponent(requestParameter[1]) : null;
                requestParameters.get(requestParameterName).add(requestParameterValue);
            }
        }
        return requestParameters;
    }

    private static String decodeUrlComponent(final String urlComponent) {
        try {
            return URLDecoder.decode(urlComponent, CHARSET.name());
        } catch (final UnsupportedEncodingException ex) {
            throw new InternalError(ex);
        }
    }
}

ありがとう!

4

1 に答える 1

1

サーバーが応答する前にプログラムが終了しているようです。私はそれがスタンドアロンアプリだと推測しているので、同時に実行し続けるものは何もなかったので、おそらく迅速なアプリ自体の中で実行され続け、問題はありません.

于 2015-06-25T17:48:22.850 に答える