アンドロイドアプリでSendUserIdTokenToBackend()メソッドを使用してトークンを投稿しようとしています。投稿でアンドロイドアプリから送信されたパラメータは、Go言語で書かれたバックエンドサーバで常に空です。
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の結果はOKです。ログにトークン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を得ることができない、idTokenは空です。 idTokenパラメータを取得する前にparseForm()を呼び出そうとしましたが、動作しませんでした。私は2泊のためにここにこだわっています。助けてください。