通过发布从Android应用程序发送的参数在用Go语言编写的后端服务器上始终为空

时间:2016-04-25 16:23:29

标签: android http google-app-engine post go

我正在尝试使用Android应用中的SendUserIdTokenToBackend()方法发布令牌。

private class SendUserIdTokenToBackend extends AsyncTask<String, Void, String> {

    private Exception exception;

    @Override
    protected String doInBackground(String... idToken) {
        Log.d(TAG, "idToken" + idToken);
        try {
            List<Pair> params = new ArrayList<Pair>();
            Pair<String, String> pair = Pair.create("idToken", idToken[0]);
            params.add(pair);
            String paramString = getQuery(params);

            URL url = new URL("http://itforhr.com/webservice/android-sign-in");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");

            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();

            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));

            writer.write(paramString);

            writer.flush();
            writer.close();
            os.close();

            Log.d(TAG, "getQuery:" + paramString);


            conn.connect();

            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder stringBuilder = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                stringBuilder.append(line + "\n");
            }

            return stringBuilder.toString();


        } catch (Exception e) {

            return  "Error sending ID token to backend. " + e.toString();
        }
    }

    @Override
    protected void onPostExecute(String result) {


        mIdTokenTextView.setText(getString(R.string.id_token_fmt, result));
    }
}


private String getQuery(List<Pair> params) throws UnsupportedEncodingException
{
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (Pair pair : params)
    {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.first.toString(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.second.toString(), "UTF-8"));
    }

    return result.toString();
}

Log.d结果没问题。我在日志中看到了令牌ID正确打印。

但是在服务器端,我无法获得idToken参数

    func init() {
        http.HandleFunc("/webservice/android-sign-in/", androidSignInHandler)
    }

    func androidSignInHandler(w http.ResponseWriter, r *http.Request) {

        log.Println("(-------- Entering androidSignInHandler --------)")

        ctx := appengine.NewContext(r)

        idToken := r.FormValue("idToken")

        client := urlfetch.Client(ctx)
        _, err := client.Get("https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=" + idToken)

        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        } else {

            w.Header().Set("Content-Type", "text/html")

            fmt.Fprintf(w, "%v and %v", r.PostForm, idToken)

        }

        log.Println("(-------- Exiting androidSignInHandler --------)")

    }

fmt打印出“ map []和”,idToken为空。我尝试在获取idToken参数之前调用parseForm()但它不起作用。我被困在这里住了两晚。请帮忙。

1 个答案:

答案 0 :(得分:1)

看起来go中的处理程序应该工作,并且java代码应该发送正确的请求。通常在这些情况下,分别测试零件很有用。

测试服务器的一种方法是使用curl向服务器发送请求,如

curl -v --data "idToken=theToken" http://itforhr.com/webservice/android-sign-in

并检查是否有效。如果它工作,那么你知道问题是在客户端,如果没有,它可能在服务器端。

您可以通过阅读正文而无需解析它来进一步检查服务器实际接收的内容:

b, _ := ioutil.ReadAll(r.Body)
fmt.Print(string(b))

解析后转储它:

r.ParseForm()
fmt.Printf("%#v", r.Form)

我希望这可以帮助您了解问题所在。